c++ 多线程 “锁”

C++11线程中的几种锁

  • 互斥锁(Mutex)
  • 条件锁
  • 自旋锁
  • 读写锁
  • 递归锁

线程之间的锁有: 互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言,锁的功能与性能成反比。不过我们一般不使用递归锁(C++标准库提供了std::recursive_mutex),所以这里就不推荐了。

互斥锁(Mutex)

互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量。也就是说是为了避免多个线程在某一时刻同时操作一个共享资源。例如线程池中的有多个空闲线程和一个任务队列。任何是一个线程都要使用互斥锁互斥访问任务队列,以避免多个线程同时访问任务队列以发生错乱。

在某一时刻,只有一个线程可以获取互斥锁,在释放互斥锁之前其他线程都不能获取该互斥锁。如果其他线程想要获取这个互斥锁,那么这个线程只能以阻塞方式进行等待。

头文件:< mutex >
类型: std::mutex
用法:在C++中,通过构造std::mutex的实例创建互斥元,调用成员函数lock()来锁定它,调用unlock()来解锁,不过一般不推荐这种做法,标准C++库提供了std::lock_guard和unique_lock类模板,都是RAII风格,它们是在定义时获得锁,在析构时释放锁。它们的主要区别在于unique_lock锁机制更加灵活,可以再需要的时候进行lock或者unlock调用,不非得是析构或者构造时。std::mutex和std::lock _ guard。都声明在< mutex >头文件中。
c++ 多线程 “锁”_第1张图片

//用互斥元保护列表
#include 
#include 

std::list some_list;
std::mutex some_mutex;

void add_to_list(int new_value)
{
    std::lock_guard guard(some_mutex);
    some_list.push_back(new_value);
}

以下情况会出现死锁:

mutex m0,m1;
int i = 0;
void fun0()
{
	while (i < 100)
	{
		lock_guard g0(m0);  //线程0加锁0
		lock_guard g1(m1);  //线程0加锁1
		cout << "thread 0 running..." << endl;
	}
	return;
}
void fun1()
{
	while (i < 100)
	{
		lock_guard g1(m1);  //线程1加锁1
		lock_guard g0(m0);  //线程1加锁0
		cout << "thread 1 running...   "<< i << endl;
	}
	return;
}
int main()
{
	thread p0(fun0);
	thread p1(fun1);
	p0.join();
	p1.join();
    return 0;
}

死锁:死锁是指两个或两个以上的进程(线程)在运行过程中因争夺资源而造成的一种僵局,若无外力作用,这些进程(线程)都将无法向前推进。

解决死锁的方法
1、顺序加锁


mutex m0,m1;
int i = 0;
void fun0()
{
	while (i < 100)
	{
		lock_guard g0(m0);  //线程0加锁0
		lock_guard g1(m1);  //线程0加锁1
		cout << "thread 0 running..." << endl;
	}
	return;
}
void fun1()
{
	while (i < 100)
	{
                lock_guard g0(m0);  //线程1加锁0
		lock_guard g1(m1);  //线程1加锁1
		cout << "thread 1 running... 

你可能感兴趣的:(高并发,c++,开发语言)