linux下使用线程锁互斥访问资源

简介:

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
复制代码



本文转自郝峰波博客园博客,原文链接:http://www.cnblogs.com/fengbohello/p/4112679.html,如需转载请自行联系原作者


相关文章
|
1天前
|
Java 关系型数据库 MySQL
【JavaEE“多线程进阶”】——各种“锁”大总结
乐/悲观锁,轻/重量级锁,自旋锁,挂起等待锁,普通互斥锁,读写锁,公不公平锁,可不可重入锁,synchronized加锁三阶段过程,锁消除,锁粗化
|
29天前
|
供应链 安全 NoSQL
PHP 互斥锁:如何确保代码的线程安全?
在多线程和高并发环境中,确保代码段互斥执行至关重要。本文介绍了 PHP 互斥锁库 `wise-locksmith`,它提供多种锁机制(如文件锁、分布式锁等),有效解决线程安全问题,特别适用于电商平台库存管理等场景。通过 Composer 安装后,开发者可以利用该库确保在高并发下数据的一致性和安全性。
39 6
|
1月前
|
数据采集 Java Python
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
66 0
|
2月前
|
Java 应用服务中间件 测试技术
Java21虚拟线程:我的锁去哪儿了?
【10月更文挑战第8天】
49 0
|
2月前
|
安全 调度 数据安全/隐私保护
iOS线程锁
iOS线程锁
31 0
|
2月前
|
Java API
【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁
【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁
43 0
|
2月前
|
安全 Java 程序员
【多线程-从零开始-肆】线程安全、加锁和死锁
【多线程-从零开始-肆】线程安全、加锁和死锁
56 0
|
1月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
107 8
|
1月前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
377 6
|
1月前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
86 3