目前,我正在重塑C ++中的线程池的车轮。 我已经消除了从代码几乎所有的锁,除了下面的结构的多个实例:
std::atomic_size_t counter;
void produce() {
++counter;
}
void try_consume() {
if (counter != 0) {
--counter;
// ...
}
else {
// ...
}
}
所以,我需要这个功能的线程安全的无锁版:
bool take(std::atomic_size_t& value) {
if (value != 0) {
--value;
return true;
}
return false;
}
有一个解决方案,我所知道的:使用boost::lockfree::queue<std::monostate>
其中pop()
做这项工作。 有没有更好/更快的解决方案?