【发布时间】:2015-10-05 14:06:57
【问题描述】:
我有以下情况:
两个 C++11 线程正在进行计算,它们通过 std::mutex 同步。
线程 A 锁定互斥体,直到数据为线程 B 执行的操作做好准备。当互斥锁被解锁时,线程 B 开始工作。
线程 B 尝试锁定互斥体并被阻塞,直到被线程 A 解锁。
void ThreadA (std::mutex* mtx, char* data)
{
mtx->lock();
//do something useful with data
mtx->unlock();
}
void ThreadB (std::mutex* mtx, char* data)
{
mtx->lock(); //wait until Thread A is ready
//do something useful with data
//.....
}
断言线程A可以先阻塞互斥体。
现在我想知道线程 B 中的 mtx->lock() 是等待主动还是被动。线程 B 轮询互斥体状态并浪费处理器时间或在互斥体解锁时被调度程序被动释放也是如此。
在不同的 C++ 参考文献中,只提到了线程被阻塞,但没有提到阻塞的方式。
但是,std::mutex 实现是否几乎不依赖于使用的平台和操作系统?
【问题讨论】:
-
如果你想让线程 B 在线程 A 执行一些其他工作后做一些工作,你肯定想要一个
std::condition_variable。另外,避免在代码中直接调用lock()成员函数;更喜欢使用std::unique_lock<T>或std::lock_guard<T>。 -
我知道这是一种标准的做法。提到的例子是一个相当综合的例子。我想知道的是这种等待条件的特征,而不用花几天时间阅读 C++ 标准论文。
-
这将是您的标准库的实现者认为在您的平台上最好的任何内容。
标签: c++ multithreading c++11