升压:互斥从任何线程可以解锁?(Boost: mutex unlocking from any th

2019-09-28 16:35发布

我开始使用boost ::线程最近(操作系统,VS10,BoostPro),并发现互斥体可以通过任何线程解锁,而不是只有拥有它的线程。 此外它煤层,基本lock_guard +互斥组合做多锁内部的一些统计()和unlock(),但它不是一个大问题,我猜。

是否有人知道为什么会以这样的方式设计的? 是不是故意的? (或者有什么毛病我的编译环境/库?)

示例应用:

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

using namespace std;


class NamedThread
{
public:
    NamedThread(string name_, boost::mutex& mtx_) :
      mtx(mtx_), name(name_) {}

    void operator ()()
    {
        for (int i = 0; i < 10; ++i)
        {
            boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
            cout << name << endl;

            //boost::lock_guard<boost::mutex> guard1(mtx);
            //boost::lock_guard<boost::mutex> guard2(mtx);

            boost::unique_lock<boost::mutex> guard1(mtx);
            boost::unique_lock<boost::mutex> guard2(mtx);
        }


    }

    string name;
    boost::mutex& mtx;
};

class UnlockerThread
{
public:
    UnlockerThread(string name_, boost::mutex& mtx_) :
      mtx(mtx_), name(name_) {}

    void operator ()()
    {
        for (int i = 0; i < 100; ++i)
        {
            boost::this_thread::sleep(boost::posix_time::milliseconds(3000));
            cout << name << ": unlocking" << endl;
            mtx.unlock(); // !!! IT WORKS !!!
        }
    }

    string name;
    boost::mutex& mtx;
};


int main()
{
    boost::mutex mtx;

    NamedThread th2("Thread1", mtx);
    boost::thread t2(th2);

    UnlockerThread th3("UnlockerThread", mtx);
    boost::thread t3(th3);

    t2.join();

    char ch;
    cin >> ch;
    return 0;
}

谢谢,

Answer 1:

Boost文档是很清楚,调用mutex.unlock的前提条件是,“当前线程拥有*这一点。” 这并不意味着,违反该先决条件将导致异常/错误/崩溃(虽然它可能是一个调试版本不错),但你不能依靠在这种情况下任何具体的行为。

的win32实施似乎实现大部分的逻辑用于使用原子指令的互斥锁 - 大概这是因为对于更复杂的互斥锁类型(递归/定时)win32上有限的支持。 Win32的原生关键部分只能用于简单的互斥体(和Win32的原生互斥过于重量级的进程互斥)。



文章来源: Boost: mutex unlocking from any thread possible?