Linux多线程的使用一:互斥锁
多线程经常会在Linux的开发中用到,我想把平时的使用和思考记录下来,一是给自己做个备忘,二是分享给可能会用到的人。
POSIX标准下互斥锁是pthread_mutex_t,与之相关的函数有:
1 int pthread_mutex_init(pthread_mutex_t * mutex , pthread_mutexattr_t * attr);
2 int pthread_mutex_destroy (pthread_mutex_t * mutex);
3 int pthread_mutex_lock (pthread_mutex_t * mutex );
4 int pthread_mutex_unlock (pthread_mutex_t * mutex );
5 int pthread_mutex_trylock (pthread_mutex_t * mutex );
初始化锁用pthread_mutex_init,也可以用pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER(普通锁,最常见)来初始化;销毁用pthread_mutex_destroy,Linux中互斥锁并不占用资源,所以不去销毁也可以。一旦互斥锁被锁住了(pthread_mutex_lock),另一个地方再调用pthread_mutex_lock,就会被阻塞住,直到有pthread_mutex_unlock来解锁这个互斥锁,以此来保证多线程执行的有序性。pthread_mutex_trylock不会被阻塞住,如果当前互斥锁被锁住了,pthread_mutex_trylock会返回一个异常值;如果没被锁住,就去锁定之,和pthread_mutex_lock效果一样。我感觉trylock在平时并不常用,最常用的还是初始化,lock,unlock,因为Linux下锁不去销毁也可以,所以destory用的也不多。
在C++的使用环境中,通常为了方便使用,会去封装一下:

1 class CMutex
2 {
3 public:
4 CMutex()
5 {
6 mutex = PTHREAD_MUTEX_INITIALIZER;
7 }
8 ~CMutex(){}
9 void Lock()
10 {
11 pthread_mutex_lock(&mutex);
12 }
13 void Unlock()
14 {
15 pthread_mutex_unlock(&mutex);
16 }
17 private:
18 pthread_mutex_t mutex;
19 };

还有较常用的方式是封装成自动锁,当这个对象创建的时候上锁;当执行到这个对象的作用域外,对象销毁,自动解锁。

1 class CAutoMutex
2 {
3 public:
4 CAutoMutex()
5 {
6 mutex = PTHREAD_MUTEX_INITIALIZER;
7 pthread_mutex_lock(&mutex);
8 }
9 ~CAutoMutex()
10 {
11 pthread_mutex_unlock(&mutex);
12 }
13 private:
14 pthread_mutex_t mutex;
15 };
简介
头文件
函数体
Linux多线程的使用一:互斥锁的更多相关文章
- Linux Qt使用POSIX多线程条件变量、互斥锁(量)
今天团建,但是文章也要写.酒要喝好,文要写美,方为我辈程序员的全才之路.嘎嘎 之前一直在看POSIX的多线程编程,上个周末结合自己的理解,写了一个基于Qt的用条件变量同步线程的例子.故此来和大家一起分 ...
- python 使用多线程进行并发编程/互斥锁的使用
import threading import time """ python的thread模块是比较底层的模块,python的threading模块是对thread做了 ...
- python多线程编程(3): 使用互斥锁同步线程
问题的提出 上一节的例子中,每个线程互相独立,相互之间没有任何关系.现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1.很容易写出这样的 ...
- python多线程,event,互斥锁,死锁,递归锁,信号量
Python多线程/event 多线程-threading python的thread模块是⽐较底层的模块, python的threading模块是对thread做了⼀些包装的, 可以更加⽅便的被使⽤ ...
- 多线程编程-- part5.1 互斥锁ReentrantLock
ReentrantLock简介 Reentrantlock是一个可重入的互斥锁,又被称为独占锁. Reentrantlock:分为公平锁和非公平锁,它们的区别体现在获取锁的机制上是否公平.“锁”是为了 ...
- 多线程编程-- part5.1 互斥锁之公平锁-获取锁
基本概念 1.AQS:AbstractQueuedSynchronizer类 AQS是java中管理“锁”的抽象类,锁的许多公共方法都是在这个类中实现.AQS是独占锁(例如,ReentrantLock ...
- 【Linux多线程】同步与互斥的区别
同步与互斥这两个概念经常被混淆,所以在这里说一下它们的区别. 一.同步与互斥的区别 1. 同步 同步,又称直接制约关系,是指多个线程(或进程)为了合作完成任务,必须严格按照规定的 某种先后次序来运行. ...
- 多线程编程-- part5.1 互斥锁之非公平锁-获取与释放
非公平锁之获取锁 非公平锁和公平锁在获取锁的方法上,流程是一样的:它们的区别主要表现在“尝试获取锁的机制不同”.简单点说,“公平锁”在每次尝试获取锁时,都是采用公平策略(根据等待队列依次排序等待):而 ...
- 多线程编程-- part5.1 互斥锁之公平锁-释放锁
释放公平锁 1.unlock() unlock()在ReentrantLock.java中实现的,源码如下: public void unlock() { sync.release(1); } 说明: ...
- Linux互斥锁、条件变量和信号量
Linux互斥锁.条件变量和信号量 来自http://kongweile.iteye.com/blog/1155490 http://www.cnblogs.com/qingxia/archive/ ...
随机推荐
- 每日一问(常用的集合接口和类有哪些【二】)—ArrayList类和数组之间的转换
ArrayList的实质是数组,但是在类的实例中所存储的数组是无法访问的,因此实际上是无法直接作为数组使用,那么如何将这两者进行转化呢? Collection接口定义了toArray的方法,可将实现该 ...
- vyatta的fork开源版本vyos
vyatta的fork开源版本vyos 来源: https://www.reddit.com/r/networking/comments/3dvwfy/who_here_is_using_vyos/ ...
- BZOJ 2157: 旅游
2157: 旅游 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1347 Solved: 619[Submit][Status][Discuss] ...
- GDOI2018记录
说实话,直到初三暑假升高一的时候,我才开始形成竞赛观.那时才顿觉一年的各个比赛是多么重要. 紧接着我的NOIP就直接爆炸了.这意味着我一年也完蛋了.各种人去WC,然后我留在家里. 那GDO ...
- PHP正则表达式函数学习
正则表达式是在日常开发中经常用到的,通常一些使用频率过高的正则表达式都是直接粘贴复制,对于基础正则的使用还是要铭记于心的,今天抽时间整理一些php正则表达式的用法. 一.php中常用的正则表达式函数 ...
- SenseTime Ace Coder Challenge 暨 商汤在线编程挑战赛 A. 地铁站
//其实比赛的时候就想到这方法了,但看到数据太吓人,就没写//看着标程,实际上就是这方法,太坑爹…… /* 假设值为k,对于图中任意两点,圆1半径k/t1,圆2半径k/t2 圆1与圆2的交集为可以设置 ...
- 文档比较比对工具Beyond Compare
Beyond Compare 可以比较文件夹或文件
- Python 爬虫入门(一)
毕设是做爬虫相关的,本来想的是用java写,也写了几个爬虫,其中一个是爬网易云音乐的用户信息,爬了大概100多万,效果不是太满意.之前听说Python这方面比较强,就想用Python试试,之前也没用过 ...
- 【Asp.net入门04】第一个ASP.NET 应用程序-如何添加Web窗体到网站中
添加Web窗体 本部分内容: 什么是web form 怎样添加web form 1.添加Web窗体到项目中 Web 窗体是一项 ASP.NET 功能,您可以使用它为 Web 应用程序创建用户界面.We ...
- nginx反向代理下载文件失败处理
最近遇到了客户在从我们的服务器下载文件失败时的情况.然后把解决方案一并整理一下以备后续.需要说明的是,我们前端都是使用nginx来做反向代理,后面的逻辑处理采用php的方式. 1.缓存目录不可写 ng ...