线程1——互斥锁

头文件

#include <pthread.h>


 

创建新线程函数

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);


 

结束线程函数

void pthread_exit(void *retval);


 

等待线程结束:

int pthread_join(pthread_t thread, void **retval);


 

创建互斥锁
pthread_mutex_t *mutex
pthread_mutex_init(互斥锁指针,NULL)

//线程互斥锁加锁
int pthread_mutex_lock(pthread_mutex_t *mutex)

//线程互斥锁解锁
int pthread_mutex_unlock(pthread_mutex_t *mutex)

//线程互斥锁销毁
int pthread_mutex_distory(pthread_mutex_t *mutex)


 

 

案例:分别用三个线程打出1-30报数

 1 #include <pthread.h>
 2 #include <stdio.h>
 3 #include <unistd.h>
 4 #include <stdlib.h>
 5 //声明三个新进程
 6 void* task1(void *arg);
 7 void* task2(void *arg);
 8 void* task3(void *arg);
 9 pthread_mutex_t lock;    //互斥锁指针
10 static int buf[30]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30};
11 
12 
13 
14 int main(void)
15 {
16     int ret;
17     
18     //创建初始化互斥锁
19     pthread_mutex_init(&lock,NULL);
20     
21     //声明三个指针,指向线程的id
22     pthread_t tid1,tid2,tid3;
23     //创建三个新线程,用刚才的指针,
24     pthread_create(&tid1,NULL,task1,(void*)5);
25     pthread_create(&tid2,NULL,task2,(void*)6);
26     pthread_create(&tid3,NULL,task3,(void*)7);
27     
28     printf("Main thread\r\n");
29     //等待线程结束运行
30     pthread_join(tid1,(void **)&ret);
31     pthread_join(tid2,(void **)&ret);
32     pthread_join(tid3,(void **)&ret);
33     
34     sleep(1);
35     printf("New thread1 id:%ld\r\n",tid1);
36     printf("New thread2 id:%ld\r\n",tid2);
37     printf("New thread3 id:%ld\r\n",tid3);
38     
39     //销毁互斥锁
40     pthread_mutex_destroy(&lock);
41     
42 }
43 
44     int i = 0;
45 
46 void* task1(void *arg)
47 {
48     while(i<30){
49     
50     //上锁
51     pthread_mutex_lock(&lock);
52     printf("task1:%d\r\n",buf[i]);
53     i += 1;
54     //解锁
55     pthread_mutex_unlock(&lock);
56     usleep(1);
57     }
58     pthread_exit(NULL);
59 }
60 
61 
62 void* task2(void *arg)
63 {
64     
65     while(i<30)
66     {
67     
68     //上锁
69     pthread_mutex_lock(&lock);
70     printf("task2:%d\r\n",buf[i]);
71     i += 1;
72     //解锁
73     pthread_mutex_unlock(&lock);
74     usleep(1);
75     }
76     pthread_exit(NULL);
77 }
78 
79 void* task3(void *arg)
80 {
81     
82     while(i<30)
83     {
84     
85     //上锁
86     pthread_mutex_lock(&lock);
87     printf("task3:%d\r\n",buf[i]);
88     i += 1;
89     //解锁
90     pthread_mutex_unlock(&lock);
91     usleep(1);
92     }
93     pthread_exit(NULL);
94 }

上锁和解锁,要放在使用公共资源的前后,比如例中的 i 前后。

 

posted @ 2019-10-14 13:22  祁峰_1024  阅读(189)  评论(0编辑  收藏  举报