2

我有一个线程需要被阻塞,直到另一个线程发生某些事情。这听起来很典型,我有这个解决方案。

//thread 1
mux.lock();
//send work to another thread
mux.lock(); //will likely block which I want

//thread 2
//get the work sent over from thread 1
//work on it, then
mux.unlock(); //unblock thread 1 - all good

这似乎在 Linux 上工作得很好,它不需要条件变量——除了 C++ 标准说两次在同一个线程中获取锁是未定义的行为——我在线程 1 中这样做。

4

3 回答 3

5

标准std::mutex不能被锁定它的线程以外的线程解锁。尝试这是未定义的行为。

cppreference开始std::mutex::unlock

解锁互斥锁。

互斥锁必须由当前执行线程锁定,否则行为未定义。

因此,您提出的策略不适用于std::mutex.

于 2019-11-27T21:06:27.013 回答
0

也许try_lock?您可以使用自旋锁。有点像:

while(mutex.try_lock()) 
    sleep(100);

不会崩溃并且会阻塞,直到第一个线程解锁互斥锁。 https://en.cppreference.com/w/cpp/thread/mutex/try_lock

于 2019-11-27T21:31:13.897 回答
0

我看到的最好/最简单的解决方案是使用 boost::barrier; 除了它不那么灵活 - 例如,您不能添加通常需要的超时行为。

于 2019-11-28T00:30:39.187 回答