linux C 多線程/線程池編程 同步實例

在多線程、線程池編程中常常會遇到同步的問題。編程

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

相關文章
相關標籤/搜索