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/ ...
随机推荐
- 远程连接工具SSH和linux的连接
实际开发中,Linux服务器都在其他的地方,我们要通过远程的方式去连接Linux并操作它,Linux远程的操作工具有很多,企业中常用的有Puttty.secureCRT.SSH Secure等.我使用 ...
- 《Head First Java》读书笔记
primitive主数据类型有8种: boolean.char.byte.short.int.long.float.double 没有对象变量,只有引用到对象的变量,对象引用变量保存存取对象的方法 实 ...
- Rotting Oranges - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Rotting Oranges - LeetCode 注意点 解法 解法一:bfs.首先先统计所有新鲜的橘子数目fresh,如果fresh大于0则一直执行 ...
- C++继承与组合的区别
C++程序开发中,设计孤立的类比较容易,设计相互关联的类却比较难,这其中会涉及到两个概念,一个是继承(Inheritance),一个是组合(Composition).因为二者有一定的相似性,往往令程序 ...
- Java之Java程序与虚拟机
Java为什么要在虚拟机中运行 简单的来说,Java作为一门高级程序语言,语法复杂,抽象度高,不能直接翻译为机器码在机器上运行,所以设计者就设计了虚拟机,通过编译器将Java程序转换成虚拟机所能识别的 ...
- 解题:HAOI 2012 道路
题面 这题不开O2怎么过=.= 可能这种有关最短路的计数题做多了就有些感觉了...... 以每个点为基准跑出一张最短路图,然后对每个边$(u,v)$统计两个东西.一个$pre[u]$表示到达$u$这个 ...
- striding layers 是什么意思?
https://www.zhihu.com/question/66283266/answer/240344515 第一句 We adapted the VGG-16 network (Simonyan ...
- 解决Anaconda4.2 Navigator打不开的问题
参照博客:http://blog.csdn.net/k3v1n1990s/article/details/72975528?utm_source=itdadao&utm_medium=refe ...
- jQuery读取KindEditor的值
$(document.getElementsByTagName("iframe")[0].contentWindow.document.body).html();
- np.argsort函数
np.argsort函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me numpy.argsort(a, axis=-1, kind='quicksort', order=None) 功能: ...