设为首页 收藏本站
查看: 308|回复: 0

[经验分享] linux下使用线程锁互斥访问资源

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-10-29 13:39:11 | 显示全部楼层 |阅读模式
  linux使用线程锁访问互斥资源:
  1、线程锁的创建



pthread_mutex_t g_Mutex;
  
  2、完整代码如下



  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <pthread.h>
  4 #include <stdlib.h>
  5 #include <unistd.h>
  6 #include <errno.h>
  7 #include <signal.h>
  8
  9 #define READ_TIME    20000
10 #define WRITE_TIME    30000
11
12 pthread_mutex_t g_Mutex;
13 int g_iX = 0;
14 int g_rwok = 0;
15
16 bool bExit = false;
17
18 void sig(int signal)
19 {
20     bExit = true;
21 }
22
23 /* writer pthread, write per 30000 us */
24 void * writer(void * arg)
25 {
26     while(1)
27     {
28         if(true == bExit)
29         {
30             g_rwok++;
31             break;
32         }
33         if(EBUSY != pthread_mutex_trylock(&g_Mutex))
34         {
35             printf("\033[0;32mwriter : lock, write begin\033[0m\n");
36             g_iX = 1;
37             usleep(WRITE_TIME);
38             pthread_mutex_unlock(&g_Mutex);
39             printf("\033[0;32mwriter : write ok, unlock\033[0m\n");
40         }
41         else
42         {
43             printf("\033[0;32mwriter : \033[0;31mbusy , can not write\033[0m\n");
44         }
45         usleep(WRITE_TIME);
46     }
47
48     return NULL;
49 }
50
51 /* reader pthread, read per 20000 us */
52 void * reader(void * arg)
53 {
54     while(1)
55     {
56         if(true == bExit)
57         {
58             g_rwok++;
59             break;
60         }
61         if(EBUSY != pthread_mutex_trylock(&g_Mutex))
62         {
63             printf("\033[0;33mreader : lock\033[0m\n");
64             g_iX = 0;
65             usleep(READ_TIME);
66             pthread_mutex_unlock(&g_Mutex);
67             printf("\033[0;33mreader : unlock , read ok\033[0m\n");
68         }
69         else
70         {
71             printf("\033[0;33mreader : \033[0;31mbusy , can not read\033[0m\n");
72         }
73         usleep(READ_TIME);
74     }
75
76     return NULL;
77 }
78
79 int main(int argc, char *argv[])
80 {
81     signal(SIGINT, sig);
82     memset(&g_Mutex, sizeof(g_Mutex), 0);
83     pthread_mutex_init(&g_Mutex, NULL);
84     
85     pthread_t preader, pwriter;
86     pthread_create(&preader, NULL, reader, NULL);
87     pthread_create(&pwriter, NULL, writer, NULL);
88     while(1)
89     {
90         if(true == bExit && 2 == g_rwok)
91         {
92             break;
93         }
94         usleep(100000);
95     }
96     pthread_mutex_destroy(&g_Mutex);
97     printf("\033[0;33mdestroy mutex\033[0m\n");
98
99     return 0;
100 }
  3、运行结果如下



reader : lock
writer : busy , can not write
reader : unlock , read ok
writer : lock, write begin
reader : busy , can not read
writer : write ok, unlock
reader : lock
reader : unlock , read ok
writer : lock, write begin
reader : busy , can not read
writer : write ok, unlock
DSC0000.jpg
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-132325-1-1.html 上篇帖子: linux下安装ipython 下篇帖子: nslook使用详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表