适用于工作线程的螺纹"fence"

Suitable thread "fence" for a worker thread

本文关键字:fence 工作 线程 适用于      更新时间:2023-10-16

我有一个Worker类,它运行自己的thread并行地做一些工作。在特定的时间间隔内,我希望它是空闲的。我有一个接口

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的矩阵乘法(小数据集)。然后
  • 是否有一种替代方法,可以达到相同的效果,但开销更少?

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

在争用的情况下,锁定成为一个代价高昂的操作,因为大多数实现将调用内核来等待互斥锁解锁。然而,在这种情况下,您可能并不关心,因为整个要点将首先停止线程。