2個線程共同處理冒泡排序 Linux 雙線程處理

來源:互聯網
上載者:User

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>

int arr[]={67,45,7,348,60,4,87,2,3,5};
int g_i=0;
pthread_t thread[2];
pthread_mutex_t mutex_1,mutex_2;//互斥鎖

void print_arry()//列印數組
{
        int i=0;
        for(;i<10;i++)
        {
                printf("%d\t",arr[i]);
        }
        printf("\n");
}
void swap_elem(int *a,int *b)//交換地址中的值
{
        int temp;
        temp=*a;
        *a=*b;
        *b=temp;
}
void *entrance_1(void *arg)//線程1的處理函數
{
        printf("1\n");
        int j=0;
        for(;g_i<10;g_i++)
        {
                pthread_mutex_lock(&mutex_2);
                //      printf("1g_i=%d\n",g_i);
                printf("線程1執行後台排序.\n");
                for(j=0;j<10-g_i-1;j++)                            

               {
                        if(arr[j]>arr[j+1])
                        {
                                swap_elem(&arr[j],&arr[j+1]);
                        }
                }
                pthread_mutex_unlock(&mutex_1);
        }

        return ((void *)1);
}
void *entrance_2(void *arg)//線程2的處理函數
{
        printf("2\n");
        int j=0;
        for(;g_i<10;g_i++)
        {
                pthread_mutex_lock(&mutex_1);

// printf("2g_i=%d\n",g_i);
  printf("線程2執行後台排序.\n");
  for(j=0;j<10-g_i-1;j++)
  {
   if(arr[j]>arr[j+1])
   {
    swap_elem(&arr[j],&arr[j+1]);
   }
  }
  pthread_mutex_unlock(&mutex_2);
 }
 return ((void *)2);       
}

void create_two_thread()//建立2個線程
{

 memset(thread,0,sizeof(thread));
 if((pthread_create(&thread[0],NULL,entrance_1,NULL))==0)
 {
  printf("建立線程1成功\n");
 }else{

  printf("建立線程1失敗\n");
  exit(EXIT_FAILURE);
 }
 if((pthread_create(&thread[1],NULL,entrance_2,NULL))==0)
 {
  printf("建立線程2成功\n");
 }else{

  printf("建立線程2失敗\n");
  exit(EXIT_FAILURE);
 }

}
void do_and_wait()//2線程執行與等待
{
 void *ret[2];
 if(thread[0]!=0)
 {
  pthread_join(thread[0],&ret[0]);
  printf("\n線程1執行結束退出\n");
 }else{
  printf("線程1建立失敗\n");
  exit(EXIT_FAILURE);
 } 

 if(thread[1]!=0)
 {

   pthread_join(thread[1],&ret[1]);
  printf("\n線程2執行結束退出\n");

 }else{
  printf("線程2建立失敗\n");
  exit(EXIT_FAILURE);
 }
 printf("線程1的傳回值為:%d\n",(int) ret[0]);
 printf("線程2的傳回值為:%d\n",(int) ret[1]);
 pthread_mutex_destroy(&mutex_1);
 pthread_mutex_destroy(&mutex_2);
}

int main()
{
 printf("主函數,建立2個線程,共同實現冒泡排序\n");
 pthread_mutex_init(&mutex_1,NULL);
 pthread_mutex_init(&mutex_2,NULL);
 print_arry();
 create_two_thread();
 do_and_wait();
 printf("排序完成.\n");
 print_arry();
 return 0;
}
運行結果為:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.