【发布时间】:2013-09-21 20:59:26
【问题描述】:
我在概念化unique_lock 应该如何跨线程操作时遇到了一些麻烦。我试着做一个简单的例子来重新创建我通常会使用condition_variable 的东西。
#include <mutex>
#include <thread>
using namespace std;
mutex m;
unique_lock<mutex>* mLock;
void funcA()
{
//thread 2
mLock->lock();//blocks until unlock?Access violation reading location 0x0000000000000000.
}
int _tmain(int argc, _TCHAR* argv[])
{
//thread 1
mLock = new unique_lock<mutex>(m);
mLock->release();//Allows .lock() to be taken by a different thread?
auto a = std::thread(funcA);
std::chrono::milliseconds dura(1000);//make sure thread is running
std::this_thread::sleep_for(dura);
mLock->unlock();//Unlocks thread 2's lock?
a.join();
return 0;
}
【问题讨论】:
-
如果你通常需要条件变量,那么你需要条件变量。
unique_lock只是互斥锁所有权的抽象。它所做的所有同步都是锁定和解锁互斥锁。 -
@zch 这纯粹是为了了解发生了什么:-)
-
unique_lock并不是要共享的,只是为了在特定范围上持有锁(它只是互斥锁的 RAII 包装器,仅此而已)。当然,您可以尝试滥用它,并且就滥用而言直言不讳,我认为您确实做到了。 ;) -
每个资源都有一个互斥锁(全局);每个线程都有一个锁。
标签: c++ c++11 concurrency locking