适用于工作线程的线程“fence”

时间:2015-07-13 15:35:38

标签: c++ multithreading mutex c++14

我有一个Worker类,它运行自己的thread来并行完成一些工作。在特定的intervalls期间,我希望它是空闲的。我有一个界面

class Worker
{
    mutex m_wait;

    void pause() {
        m_wait.lock();
    }

    void continue() {
        m_wait.unlock();
    }

    static doWork(mutex& lock) {
        while(true) {
            {
                lock_guard _l(lock);
                // Lock and immidiatly unlock again
            }
            // Only *some* work
        }
    }
};

正如您所看到的,doWork方法偶尔检查互斥锁是否被锁定(pause()),如果是,则不会继续。

我对速度和替代方案的实施有一些疑问:

  • 检查lock会产生多少开销?假设我在实际工作(小数据集)中进行10x10 * 10x10的矩阵乘法。然后
  • 是否有替代方案,可以达到相同的效果,但开销更少?

1 个答案:

答案 0 :(得分:0)

锁定/解锁互斥锁的成本取决于您的平台和特定的互斥锁实现。在最好的情况下,锁定/解锁没有争用的互斥锁相当于两个互锁内存操作。

如果争用锁定成为一项代价高昂的操作,因为大多数实现都会进行内核调用以等待互斥锁解锁。但是在这种情况下你可能并不在意,因为最重要的是首先停止线程。