如果Boost :: thread :: mutex没有所有权,可以解锁它吗?

时间:2019-03-15 07:08:27

标签: c++ multithreading boost mutex unlock

根据Boost.Thread的文档,unlock()似乎是由互斥量拥有的线程调用的。

  

要求:
    当前线程拥有m。

但是,在我的测试中,其他线程可以解锁互斥锁。

include <iostream>
#include <boost/thread/thread.hpp>

boost::mutex m;
boost::mutex print_m;

void sleep(int seconds)
{
    boost::this_thread::sleep_for(boost::chrono::seconds(seconds));
}

void print(const char* msg)
{
    boost::mutex::scoped_lock lock(print_m);
    std::cout << msg << boost::this_thread::get_id() << std::endl;
}

void lock()
{
    print("Before Lock  : ");
    m.lock();
    print("After Lock   : ");
}

void unlock()
{
    print("Before Unlock: ");
    m.unlock();
    print("After Unlock : ");
}

int main(int argc, char* argv[])
{
    print("Main thread  : ");
    sleep(1);

    boost::thread t1(lock);
    sleep(1);

    boost::thread t2(lock);
    sleep(1);

    boost::thread t3(unlock);
    sleep(1);

    boost::thread t4(unlock);

    t1.join();
    t2.join();
    t3.join();
    t4.join();

    return 0;
}

结果是:

Main thread  : 7f306a294740

Before Lock  : 7f3068c6c700
After Lock   : 7f3068c6c700

Before Lock  : 7f306846b700

Before Unlock: 7f3067c6a700
After Unlock : 7f3067c6a700
After Lock   : 7f306846b700

Before Unlock: 7f3067469700
After Unlock : 7f3067469700

(空行表示经过1秒。)

我对增强互斥锁解锁理解不正确吗?

P.S。

我知道互斥锁通常用于关键部分。
但是,我希望知道文档Requires的确切含义。

注意:我更改了源代码以更详细地表达锁定行为。

0 个答案:

没有答案