C++

C++,第1张

C++11提供几种形式的mutex,并对应的提供了如下接口:

mutex,是最基本的互斥类:

当前状态lock

try_lock

unlock
未被任何线程加锁调用线程将该mutex锁住,直到调用线程调用unlock释放锁调用线程将该mutex锁住,直到调用线程调用unlock释放锁未定义行为
已被其他线程加锁调用线程将被阻塞,直到其它线程unlock该mutex调用线程返回false,不会阻塞调用线程未定义行为
已被当前线程加锁死锁死锁调用线程释放锁

recursive_mutex,同一线程内可递归(重入)的互斥类:

当前状态locktry_lockunlock
未被任何线程加锁调用线程将该mutex锁住,直到调用线程调用unlock释放锁调用线程将该mutex锁住,直到调用线程调用unlock释放锁未定义行为
已被其他线程加锁调用线程将被阻塞,直到其它线程unlock该mutex调用线程返回false,不会阻塞调用线程未定义行为
已被当前线程加锁继续加锁继续加锁解锁次数与加锁次数相同后,调用线程释放锁

timed_mutex,带时限请求锁定能力的互斥类:

当前状态locktry_locktry_lock_fortry_lock_untilunlock
未被任何线程加锁调用线程将该mutex锁住,直到调用线程调用unlock释放锁调用线程将该mutex锁住,直到调用线程调用unlock释放锁调用线程将该mutex锁住,直到调用线程调用unlock释放锁调用线程将该mutex锁住,直到调用线程调用unlock释放锁未定义行为
已被其他线程加锁调用线程将被阻塞,直到其它线程unlock该mutex调用线程返回false,不会阻塞调用线程调用线程将被阻塞,不过最多只等待设定的时间长度,如果届时锁还未被其他线程释放,则该函数返回false,调用线程不会被继续阻塞调用线程将被阻塞,不过最多只等待到指定的时刻,如果届时锁还未被其他线程释放,则该函数返回false,调用线程不会被继续阻塞未定义行为
已被当前线程加锁死锁死锁死锁死锁调用线程释放锁

recursive_timed_mutex,同一线程内可递归(重入)的timed_mutex:

当前状态locktry_locktry_lock_fortry_lock_untilunlock
未被任何线程加锁调用线程将该mutex锁住,直到调用线程调用unlock释放锁调用线程将该mutex锁住,直到调用线程调用unlock释放锁调用线程将该mutex锁住,直到调用线程调用unlock释放锁调用线程将该mutex锁住,直到调用线程调用unlock释放锁未定义行为
已被其他线程加锁调用线程将被阻塞,直到其它线程unlock该mutex调用线程返回false,不会阻塞调用线程调用线程将被阻塞,不过最多只等待设定的时间长度,如果届时锁还未被其他线程释放,则该函数返回false,调用线程不会被继续阻塞调用线程将被阻塞,不过最多只等待到指定的时刻,如果届时锁还未被其他线程释放,则该函数返回false,调用线程不会被继续阻塞未定义行为
已被当前线程加锁继续加锁继续加锁继续加锁继续加锁解锁次数与加锁次数相同后,调用线程释放锁
#include 
#include 
#include 
using namespace std;

int g_d{0};

void tFunc(mutex& m)
{
	for(int i = 0; i < 1000000; ++i)
	{
		m.lock();    //通过mutex加锁避免竞争
		g_d++;
		m.unlock();
	}
}

int main(){
	mutex m;
	thread t1(tFunc, ref(m));
	thread t2(tFunc, ref(m));
	t1.join();
	t2.join();
	cout<

需要说明的是:

mutex相关类不支持拷贝构造、赋值,也不支持移动构造以及移动赋值。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/797704.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-06
下一篇2022-05-06

发表评论

登录后才能评论

评论列表(0条)