跨线程的unique_lock?

Mik*_*ail 2 c++ concurrency locking c++11

我在概念化如何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;
}
Run Code Online (Sandbox Code Playgroud)

How*_*ant 9

unique_lock不应该一次从多个线程访问.它不是以这种方式设计为线程安全的.相反,多个unique_locks(局部变量)引用相同的全局变量mutex.只有它mutex本身被设计为一次由多个线程访问.即便如此,我的陈述也排除在外~mutex().

例如,有人知道mutex::lock()多个线程可以访问它,因为它的规范包括以下内容:

同步:unlock()对同一对象的先前操作应(4.7)此操作同步.

其中同步是4.7 [intro.multithread](及其子条款)中定义的术语.


Mat*_*son 5

那看起来一点都不对。首先,release是“在不解锁的情况下解除互斥锁的关联”,这不太可能是您想要在那个地方执行的操作。这基本上意味着你不再有mutex你的unique_lock<mutex>-这将使它很没用-也许你会得到“访问冲突”的原因。

编辑:在对您的代码进行一些“按摩”之后,并说服 g++ 4.6.3 做我想做的事情(因此是#define _GLIBCXX_USE_NANOSLEEP),这是一个工作示例:

#define _GLIBCXX_USE_NANOSLEEP
#include <chrono>
#include <mutex>
#include <thread>
#include <iostream>
using namespace std;
mutex m;
void funcA()
{
    cout << "FuncA Before lock" << endl;
    unique_lock<mutex> mLock(m);
    //thread 2
    cout << "FuncA After lock" << endl;
    std::chrono::milliseconds dura(500);//make sure thread is running
    std::this_thread::sleep_for(dura);        //this_thread::sleep_for(dura);
    cout << "FuncA After sleep" << endl;
}

int main(int argc, char* argv[])
{
    cout << "Main before lock" << endl;
    unique_lock<mutex> mLock(m);
    auto a = std::thread(funcA);
    std::chrono::milliseconds dura(1000);//make sure thread is running
    std::this_thread::sleep_for(dura);        //this_thread::sleep_for(dura);
    mLock.unlock();//Unlocks thread 2's lock?
    cout << "Main After unlock" << endl;
    a.join();
    cout << "Main after a.join" << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

不确定为什么需要使用new来创建锁 tho'。当然unique_lock<mutex> mlock(m);应该做的伎俩(以及相应的变化mLock->mLock.课程)。