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

Suitable thread "fence" for a worker thread

我有一个 Worker class,它运行自己的 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() 锁定),如果锁定则不会继续。


我对这个实现的速度和备选方案有一些疑问:

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

如果发生争用,锁定将成为一项代价高昂的操作,因为大多数实现都会调用内核来等待互斥体解锁。但是,在那种情况下,您可能不在乎,因为重点是首先停止线程。