2013-12-16 302 views
0

当我运行以下,我得到一个异常:Process returned -1073741819 (0xC0000005)和程序崩溃。std :: mutex初始化异常

#include <mutex> 

class MutexTest 
{ 
public: 
    static std::mutex GlobalMutex; 
}; 

std::mutex MutexTest::GlobalMutex; 


int main() 
{ 
    MutexTest test; 
    test.GlobalMutex.unlock(); //makes it throw. 
    return 0; 
} 

但是,如果我做的:

int main() 
{ 
    StaticMutexTest test; 
    test.GlobalMutex.lock(); 
    test.GlobalMutex.unlock(); 
    test.GlobalMutex.unlock(); 
    test.GlobalMutex.unlock(); 
    return 0; 
} 

它运行得很好。我怎样才能初始化互斥量,而不是先锁定它?我在某处读到0xC0000005表示该变量未初始化。该文件表示,互斥锁必须先锁定,然后才能解锁,并且解锁互斥锁的解锁属于未定义行为。但是我没有什么可以测试它是否被锁定。

任何想法?

+0

您的互斥锁已初始化,除了您无法解锁()您的线程尚未锁定的互斥锁之外,此处没有任何问题。 – nos

回答

6

unlock() ing a std::mutex这是不是lock()编写的线程调用unlock()是未定义的行为。 std::mutex将始终处于初始解锁状态。如果你想创建一个最初被锁定的互斥锁,你需要一个封装器来完成锁定。不过,我无法想象这种设备的用途。

+0

啊,但事情是,我没有办法检查它是否已被当前线程锁定。做try_lock是未定义的行为。我卡住了吗? – Brandon

+2

@using try_lock()不是未定义的,但通常不需要检查互斥锁是否被锁定。你知道什么时候你锁定了互斥锁(因为你编写了这样的代码),所以你应该知道何时解锁它。 – nos

+3

@CantChooseUsernames:如果你不知道一个线程是否拥有一个没有的锁,那么你的设计中仍然存在更深层的错误!有很少的原因,互斥锁不是本地保存的,并且由合适的RAII类来管理,例如'std :: lock_guard '或'std :: unique_lock '。 –