linux网络编程,进程间的通信之互斥锁与条件变量
来源:互联网 发布:搜狗搜索sem优化师 编辑:程序博客网 时间:2024/06/06 09:07
互斥锁mutex
1#include<stdio.h>
2 #include<unistd.h>3 #include<pthread.h>
4 /*互斥锁函数
5 * pthread_mutex_t*
6 * pthread_mutex_init()*
7 * pthread_mutex_destory()*
8 * pthread_mutex_lock()* //阻塞,直到解锁为止才停止阻塞
9 * pthread_mutex_unlock()*//解锁
10 * pthread_mutex_try_lock()*//非阻塞函数
11 * */
12 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
13
14 void*thread_fun1(void* arg)//函数thread_fun1
15 {
16 //printf("enter fun1\n");
17 pthread_mutex_lock(&mutex);//上锁
18 //printf("mutex fun1 lock.\n");
19 printf("1\n");
20 printf("fun1 sleep...\n");
21 sleep(12);
22
23 printf("fun1 wakeup.\n");
24 pthread_mutex_unlock(&mutex);//解锁
25 //printf("mutex fun1 unlock\n");
26 }
27 void*thread_fun2(void* arg)//函数thread_fun2
28 {
29 //printf("enter fun2\n");
30 pthread_mutex_lock(&mutex);//上锁,等待
31 //printf("mutex fun2 lock\n");
32 pthread_mutex_trylock(&mutex);// 尝试锁,为非阻塞函数,若互斥锁已锁返回EBUSY,不等待
33 //pthread_mutex_lock(&mutex);
34 //printf("mutex fun2 trylock.\n");
35 printf("2\n");
36 pthread_mutex_unlock(&mutex);//解锁
37 //printf("mutex fun2 unlock\n");
38
39 }
40 int main()
41 {
42 pthread_t tid1,tid2;
43 pthread_create(&tid1, NULL, thread_fun1, NULL);// 启动线程tid1,每个线程执行thread_fun1,在tid1中保存每个线程的线程地址
44
45 pthread_create(&tid2, NULL, thread_fun2, NULL);// 启动线程tid2,每个线程执行thread_fun2,在tid2中保存每个线程的线程地址
46
47 pthread_join(tid1, NULL);//等待终止线程
48 pthread_join(tid2, NULL);//等待终止线程
互斥锁用于上锁,条件变量用于等待
条件变量cond
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<pthread.h>
4 /*
5 *pthread_cond_t*
6 *pthread_cond_init()*
7 *pthread_cond_destory()*
8 *pthread_cond_wait()//一直等待,为等待+减锁,一直等待下去
9 *pthread_cond_timedwait()//定时等待,允许线程就阻塞时间设置一个限制值
10 *pthread_cond_signal()//为加锁+ 不等待,直接加锁,唤醒,谁先阻塞,只唤醒谁,只唤醒等待在相应条件变量上的一个
线程 但需避免重复加锁
11 *pthread_cond_broadcast()// 唤醒所有阻塞在相应条件变量上的所有进程,一下子全部唤醒
12 * */
13
/*
14 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
15 pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
16
17 void* thread_fun1(void *arg)
18 {
19 printf("enter fun1\n");
20 pthread_mutex_lock(&mutex);
21
22 printf("This is fun1.\n");
23 printf("fun1 sleep...\n");
24 sleep(12);
25 //pthread_cond_wait(&cond, &mutex);
26 pthread_cond_timedwait(&cond, &mutex);
27 printf("fun1 wakeup.\n");
28 pthread_mutex_unlock(&mutex);
29 printf("fun1 unlock.\n");
30 }
31 void* thread_fun2(void *arg)
32 {
33 printf("enter fun2\n");
34 //pthread_mutex_lock(&mutex);
35 //printf("fun2 lock.\n");
36
37 printf("This is fun2.\n");
38 //printf("fun1 sleep........\n");
39 //sleep(2);
40 pthread_cond_signal(&cond);
41 //printf("fun2 sleep....\n");
42 sleep(15);
43 pthread_mutex_unlock(&mutex);
44 printf("fun2 unlock\n");
45 }
46
47 int main()
48 {
49 pthread_t tid1,tid2;
50 pthread_create(&tid1, NULL, thread_fun1, NULL);
51 pthread_create(&tid2, NULL, thread_fun2, NULL);
52
53 pthread_join(tid1, NULL);
54 pthread_join(tid2, NULL);
55 return 0;
56 }
*/
58 #define MAX_SIZE 10
59 static int max_count = MAX_SIZE;
60 static int cur_count = 1;
61
62 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
63 pthread_cond_t OS = PTHREAD_COND_INITIALIZER;
64 pthread_cond_t JS = PTHREAD_COND_INITIALIZER;
65
66 void* A_fun(void *arg)
67 {
68 while(cur_count <= max_count)
69 {
70 pthread_mutex_lock(&mutex);
71 if(cur_count % 2 == 1)
72 {
73 printf("A : %d\n",cur_count);
74 cur_count++;
75 pthread_cond_signal(&JS);
76 }
77 else
78 {
79 pthread_cond_wait(&OS, &mutex);
80 }
81 pthread_mutex_unlock(&mutex);
82 }
83 }
84 void* B_fun(void *arg)
85 {
86 while(cur_count <= max_count)
87 {
88 pthread_mutex_lock(&mutex);
89 if(cur_count % 2 == 0)
90 {
91 printf("B : %d\n",cur_count);
92 cur_count++;
93 pthread_cond_signal(&OS);
94 }
95 else
96 pthread_cond_wait(&JS, &mutex);
97 pthread_mutex_unlock(&mutex);
98 }
99 }
100 int main()
101 {
102 pthread_t ta_id, tb_id;
103 pthread_create(&ta_id, NULL, A_fun, NULL);
104 pthread_create(&tb_id, NULL, B_fun, NULL);
105
106 pthread_join(ta_id, NULL);
107 pthread_join(ta_id, NULL);
108 return 0;
109 }
读/写锁(读锁:共享锁;写锁:独占锁(线对写锁分配,即写锁优先),)
114 pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
115 void* A_fun(void *arg)
116 {
117 pthread_rwlock_wrlock(&rwlock);
118 printf("This is A fun.\n");
119 sleep(10);
120 pthread_rwlock_unlock(&rwlock);
121 }
122 void* B_fun(void *arg)
123 {
124 pthread_rwlock_rdlock(&rwlock);
125 printf("This is B fun.\n");
126 pthread_rwlock_unlock(&rwlock);
127 }
128 void* C_fun(void *arg)
129 {
130 pthread_rwlock_wrlock(&rwlock);
131 printf("This is C fun.\n");
132 pthread_rwlock_unlock(&rwlock);
133 }
134
135 void* D_fun(void *arg)
136 {
137 pthread_rwlock_rdlock(&rwlock);
138 printf("This is D fun.\n");
139 pthread_rwlock_unlock(&rwlock);
140 }
141
142 void* E_fun(void *arg)
143 {
144 pthread_rwlock_wrlock(&rwlock);
145 printf("This is E fun.\n");
146 pthread_rwlock_unlock(&rwlock);
147 }
148 void* F_fun(void *arg)
149 {
150 pthread_rwlock_rdlock(&rwlock);
151 printf("This is F fun.\n");
152 pthread_rwlock_unlock(&rwlock);
153 }
154 int main()
155 {
156 pthread_t ta_id, tb_id, tc_id, td_id, te_id, tf_id;
157 pthread_create(&ta_id, NULL, A_fun, NULL);
158 sleep(2);
159 pthread_create(&tb_id, NULL, B_fun, NULL);
160 pthread_create(&tc_id, NULL, C_fun, NULL);
161 pthread_create(&td_id, NULL, D_fun, NULL);
162 pthread_create(&te_id, NULL, E_fun, NULL);
163 pthread_create(&tf_id, NULL, F_fun, NULL);
164
165 pthread_join(ta_id, NULL);
166 pthread_join(tb_id, NULL);
167 pthread_join(tc_id, NULL);
168 pthread_join(td_id, NULL);
169 pthread_join(te_id, NULL);
170 pthread_join(tf_id, NULL);
171 }
- linux网络编程,进程间的通信之互斥锁与条件变量
- linux网络编程之POSIX条件变量
- Linux C 多线程编程之互斥锁与条件变量
- Linux进程通信[2]-互斥锁和条件变量
- linux网络编程之进程间通信基础(一):进程间通信概述
- linux网络编程之进程间通信基础(一):进程间通信概述
- 互斥量与条件变量在进程间通信的应用——生产者与消费者问题
- linux网络编程之posix 线程(四):posix 条件变量与互斥锁 示例生产者--消费者问题
- linux网络编程之posix 线程(四):posix 条件变量与互斥锁 示例生产者--消费者问题
- linux 多线程编程 互斥锁与条件变量
- linux网络编程二十七:多线程编程之信号量、互斥锁和条件变量
- 深入理解Linux进程间通信(IPC)-- 互斥锁和条件变量
- 15章 进程间通信之同步(互斥锁、条件变量、读写锁、信号量)
- linux网络编程之进程间通信基础(二):死锁、信号量与PV原语简介
- linux网络编程之进程间通信基础(二):死锁、信号量与PV原语简介
- Linux下的C编程入门之进程控制与进程通信编程
- linux线程间通信之条件变量和互斥量
- 进程间的通信(互斥锁、条件变量、读写锁、文件锁、信号灯)
- Hibernate---缓存
- react-native之初识react-native
- ZooKeeper典型应用——分布式锁
- 用CMake为Qt生成visual studio的工程
- 洛谷P1369 矩形
- linux网络编程,进程间的通信之互斥锁与条件变量
- 杭电oj1014 互质就可以了
- display:none ,inline, block, inline-block
- Go mobile(一)
- FZU1977 Pandora adventure
- Activity 跳转到指定非宿主 Fragment
- Idea git打tag
- memcached简介(转)
- 数字证书原理