互斥锁

互斥锁用于保证同一时刻只有一个线程可以访问被保护的资源。一个程序里可以同时存在多把锁,每一把锁都由一个线程独占持有,可以把锁看成一种供多线程争用的资源。

std::mutex 基本用法

下面的示例演示了如何用 std::mutex 在多线程里安全地对共享变量 x 进行累加。需要注意的是,lock() 对同一把 std::mutex 只能调用一次,如果需要在同一线程中重入加锁,应该使用 std::recursive_mutex。

此外,std::lock_guard 和 std::unique_lock 可以自动管理 mutex 的 lock 与 unlock,其作用类似智能指针对 new/delete 的管理,属于 RAII 范式。

.
                
                
                std::mutex _mutex;//全局锁
                
                 int x = 0;//资源
                
                void func_1()
                {
                	for (int i = 0; i < 500000; i++)
                	{
                	//lock 只能调用一次,如果多次可用recursive_mutex
                		_mutex.lock();//访问公共资源时,互斥,获取访问权,如果失败则阻塞直到获得访问权
                		//try_lock 获取失败则返回false 并不阻塞
                		x+=1;
                		_mutex.unlock();//释放资源
                        //lock_guard 类 和 unique_lock 类可自动管理mutex的lock和unlock ,//相当于指针的 智能指针管理new delete一样属于RAII
                
                	}
                }
                
                int main(int argc, char *argv[])
                {
                
                	auto t = std::thread(func_1);
                
                	t.detach();
                
                	auto t1 = std::thread(func_1);
                
                	t1.detach();
                
                	Sleep(1000);
                
                	cout << x << endl;
                	cout << "main thread" << endl;
                
                
                
                	system("pause");
                	return 0;
                }

递归锁 std::recursive_mutex

普通 std::mutex 不允许同一线程重复加锁,如果同一个线程在已经持有锁的情况下再次加锁,就会死锁。std::recursive_mutex 允许同一线程多次加锁,从而避免这种情况。

时间锁

时间锁支持在指定时间内尝试等待获取锁,超过时间仍未获得就放弃,从而避免无限期阻塞所造成的死锁。下面的示例中,try_lock_for 最多阻塞等待一秒。


                	std::thread t([&]
                	{
                		//while (true)
                		{
                			Sleep(100);
                			cout << mm.try_lock_for(std::chrono::seconds(1)) << endl;// 最多柱塞等待一秒,
                			cout << __FUNCTION__ << endl;
                			mm.unlock();
                		}
                
                	});
                	t.detach();
                
                	mm.lock();
                	cout << __FUNCTION__ << endl;
                	Sleep(500);
                	mm.unlock();

参考资料

MSDN 参考:https://msdn.microsoft.com/en-us/library/hh921467(v=vs.120).aspx