并发,std::mutex
互斥锁
任意时刻只有一个线程能访问互斥资源,一个程序中可以拥有多把锁,但是每一把锁 只有一个线程有访问权限,锁可以看做是一个多线程访问的资源
. 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::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