在多線程、線程池編程中常常會遇到同步的問題。編程
1.建立線程多線程
函數原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);函數
參數:thread指向線程id的指針;attr指向線程屬性的指針;第三個爲執行的方法的函數指針;arg指向給方法傳遞的參數的指針。spa
2.互斥變量線程
(1)互斥變量 pthread_mutex_t指針
(2)互斥變量鎖定 int pthread_mutex_lock(pthread_mutex_t *mutex);
code
(3)互斥變量解鎖 int pthread_mutex_unlock(pthread_mutex_t *mutex);htm
3.多線程/線程池實例blog
下面是一個Linux C多線程同步取任務的操做,設定任務總量用MAX_JOB表示,當前任務編號用current_job表示。get
文件名:a.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pthread.h> 4 #include <unistd.h> 5 #define MAX_JOB 50 ///任務總量 6 7 typedef struct { 8 pthread_t thread_tid; 9 } Thread; 10 11 Thread *tptr; 12 int current_job=1; ///當前任務編號 13 pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; ///互斥鎖 14 15 void* thread_run(void* arg) 16 { 17 int jobid; 18 for(;;) 19 { 20 pthread_mutex_lock(&lock); 21 if(current_job>MAX_JOB) ///任務已經完成 22 jobid=-1; 23 else 24 { 25 jobid=current_job; 26 current_job++; 27 } 28 pthread_mutex_unlock(&lock); 29 30 if(jobid==-1) 31 { 32 printf("thread %d over\n",(int)arg); 33 break; 34 } 35 else 36 printf("thread %d get the job %d\n",(int)arg,jobid); 37 } 38 return 0; 39 } 40 41 int main () { 42 int i; 43 int threadNum; ///線程個數 44 scanf("%d",&threadNum); 45 tptr=(Thread*)malloc(sizeof(Thread)*threadNum); 46 47 for(i=0;i<threadNum;i++) ///建立threadNum個線程 48 pthread_create(&tptr[i].thread_tid, NULL, &thread_run, (void *) i); 49 50 for(i=0;i<threadNum;i++) 51 { 52 if(current_job>MAX_JOB) 53 { 54 printf("ALL OVER!!!\n"); 55 break; 56 } 57 else 58 { 59 printf("OK\n"); 60 sleep(1); ///停留1秒 61 } 62 63 } 64 sleep(4); ///停留4秒,等待最後一批任務的完成 65 return 0; 66 }
編譯:gcc -lpthread a.c -o a
執行輸出:./a