Ubuntu下多線程簡單的線程鎖搶門票問題(C語言)

該小程序建立了4個線程做爲窗口進行演示搶票,程序中簡單的使用pthread_mutex_lock與pthread_mutex_unlock:小程序

main.c:spa

1 #include<stdio.h>
  2 #include<pthread.h>
  3 #include<stdlib.h>
  4 #include<string.h>
  5 #include<sched.h>
  6 #include<unistd.h>
  7 #define NUMBER 10   //總票數
  8 static int ticket=NUMBER; 9 static int ticket1;//標誌,1 有票 0 無票
 10 static pthread_mutex_t mut=PTHREAD_MUTEX_INITIALIZER; 11 static void *send(void *arg); 12 int main(void) 13 { 14     pthread_t tid[4]; 15     int err; 16     for(int i=1;i<5;i++){ 17         err=pthread_create(tid+i-1,NULL,send,(void *)i); 18         if(err){ 19             fprintf(stderr,"pthread_create() %s \n",strerror(err)); 20             exit(1); 21 } 22 } 23     //for(int i=0;i<5;i++)
 24     // pthread_detach(tid[0]);
 25     pthread_mutex_lock(&mut); 26     while(ticket){ 27         ticket1=1; 28         pthread_mutex_unlock(&mut); 29 sched_yield(); 30         pthread_mutex_lock(&mut); 31         ticket--; 32 } 33     pthread_mutex_unlock(&mut); 34 
 35 
 36     for(int i=0;i<4;i++){ 37 pthread_join(tid[i],NULL); 38 } 39 
 40     exit(0); 41 
 42 } 43 static void *send(void *arg){ 44     int a=(int)arg;//接收窗口編號
 45     
 46     pthread_mutex_lock(&mut); 47     while(ticket){ 48         while(!ticket1){ 49             pthread_mutex_unlock(&mut); 50 sched_yield(); //這步不須要,本窗口賣出能夠繼續賣 51             pthread_mutex_lock(&mut); 52             if(ticket==0) 53                 goto ER; 54 } 55         ticket1=0; 56         sleep(1); 57         printf("窗口[%d]賣出了No.[%d]演唱會門票\n",a,NUMBER-ticket+1); 58     // pthread_mutex_unlock(&mut);
 59         
 60 } 61     pthread_mutex_unlock(&mut); 62     pthread_exit((void *)0); 63 ER: 64     pthread_mutex_unlock(&mut); 65     pthread_exit((void *)0); 66 }

編譯:線程

(警告正常,int類型與void*轉化)code

zj@zj-pc:~/6.dir/3-29.c/ticket$ gcc ticket.c -pthread ticket.c: In function ‘main’: ticket.c:17:40: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] err=pthread_create(tid+i-1,NULL,send,(void *)i); ^ ticket.c: In function ‘send’: ticket.c:44:8: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] int a=(int)arg;

結果:blog

zj@zj-pc:~/6.dir/3-29.c/ticket$ ./a.out 窗口[2]賣出了No.[1]演唱會門票 窗口[1]賣出了No.[2]演唱會門票 窗口[1]賣出了No.[3]演唱會門票 窗口[4]賣出了No.[4]演唱會門票 窗口[4]賣出了No.[5]演唱會門票 窗口[4]賣出了No.[6]演唱會門票 窗口[4]賣出了No.[7]演唱會門票 窗口[1]賣出了No.[8]演唱會門票 窗口[1]賣出了No.[9]演唱會門票 窗口[2]賣出了No.[10]演唱會門票
相關文章
相關標籤/搜索