C++11 使用unique_lock检查互斥锁是否已拥有

C++11 使用unique_lock检查互斥锁是否已拥有,c++11,locking,unique,std,mutex,C++11,Locking,Unique,Std,Mutex,我试图使用这里的建议:检查互斥锁当前是否已锁定。乍一看它似乎可以工作,但当您尝试从多个线程使用它时,它崩溃了。我的猜测是,unique_lock不是线程安全的,这很有意义,这意味着在不编写包装器的情况下,无法轻松检查互斥锁是否已锁定 #include <iostream> #include <thread> #include <mutex> long glob=0; std::mutex mutex_; std::unique_lock <std::

我试图使用这里的建议:检查互斥锁当前是否已锁定。乍一看它似乎可以工作,但当您尝试从多个线程使用它时,它崩溃了。我的猜测是,unique_lock不是线程安全的,这很有意义,这意味着在不编写包装器的情况下,无法轻松检查互斥锁是否已锁定

#include <iostream>
#include <thread>
#include <mutex>

long glob=0;

std::mutex mutex_;
std::unique_lock <std::mutex> glock (mutex_, std::defer_lock);

void call_from_thread (int tid)
{
    std::cout <<"Started "<<tid<<std::endl;
    for (int i=0; i<1000; ++i)
    {
       std::lock_guard< std::unique_lock <std::mutex> > lock2 (glock);
       std::cout<<tid<<":"<<i<<":"<<glob<<std::endl;
       ++glob;
    };
    std::cout<<"Done "<<tid<<std::endl;
};

int main ()
{
    std::thread t [10];

    for (int i=0; i<10; ++i)
    {
        t[i]=std::thread (call_from_thread, i);
    };

    for (int i=0; i<10; ++i)
    {
        t[i].join ();
    };

    std::cout <<"Glob = "<<glob<<std::endl;
    return 0;
}
#包括
#包括
#包括
长glob=0;
std::mutex mutex;
std::unique_lock glock(互斥锁,std::defer_lock);
来自线程的无效调用线程(int tid)
{

std::cout您是在寻找
mutex::try\u lock()
,还是可能是
unique\u lock::try\u lock()
?正如您正确猜测的那样,
唯一锁
不是为线程间共享而设计的。在编写多线程代码时,我希望能够在代码中插入断言,以确认您持有所需的锁。我希望stl中有一些可用的东西允许我这样做,但看起来没有我编写了一个简单的类,它围绕std::mutex进行包装,在调试构建中,std::mutex只跟踪所拥有的线程id。我最终使用了中Ami Tavory的建议。它工作得非常好。