适用于工作线程的线程 "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()
锁定),如果锁定则不会继续。
我对这个实现的速度和备选方案有一些疑问:
- 检查
lock
有多少开销?假设我在实际工作(小数据集)中进行了 10x10*10x10 的矩阵乘法。然后
- 是否有替代方案,可以达到相同的效果但开销更少?
locking/unlocking 互斥锁的成本取决于您的平台和特定的互斥锁实现。在最好的情况下 locking/unlocking 一个没有争用的互斥体相当于两个互锁的内存操作。
如果发生争用,锁定将成为一项代价高昂的操作,因为大多数实现都会调用内核来等待互斥体解锁。但是,在那种情况下,您可能不在乎,因为重点是首先停止线程。
我有一个 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()
锁定),如果锁定则不会继续。
我对这个实现的速度和备选方案有一些疑问:
- 检查
lock
有多少开销?假设我在实际工作(小数据集)中进行了 10x10*10x10 的矩阵乘法。然后 - 是否有替代方案,可以达到相同的效果但开销更少?
locking/unlocking 互斥锁的成本取决于您的平台和特定的互斥锁实现。在最好的情况下 locking/unlocking 一个没有争用的互斥体相当于两个互锁的内存操作。
如果发生争用,锁定将成为一项代价高昂的操作,因为大多数实现都会调用内核来等待互斥体解锁。但是,在那种情况下,您可能不在乎,因为重点是首先停止线程。