问题描述
我正试图找出一种方法,将两个值压入两个boost :: lockfree :: queues并保留这对值的顺序。寻求一些想法。
例如,我的输入值是{apple1,apple2},{orange1,orange2},{peach1,peach2},...这两个队列应该看起来像:
Q1: apple1,orange1,peach1,...
Q2: apple2,orange2,peach2,...
/// multithreads can execute the following code
lockfree::queue<string*> q1(100),q2(100);
string* val1 = new String("first");
string* val2 = new String("second");
unique_lock<mutex> lk(mtx);
while (!q1.push(val1)); while (!q2.push(val2));
lk.unlock();
// do some more things
我尝试删除锁的原因是,由于另一个线程也在使用锁,所以我的代码即将达到Deallock。我有一个复杂的设计,涉及十多个线程合作完成一项任务。
解决方法
最后,我弄清楚了如何用循环替换锁。在我的设计中,这似乎提高了性能。
atomic<bool> qguard(false);
while (true) {
bool canpush=false;
if (qguard.compare_exchange_strong(canpush,true)) {
while (!q1.push(val1));
while (!q2.push(val2));
qguard.store(false);
break;
}
}
我认为可以使用1.atomic_flag进一步改进。 2.在compare_exchange_strong()函数和memory_order_release中使用memory_order_acq_rel。此解决方案是无锁的,但不是免费的。
显然,根据以下文章,这可能是一个糟糕的解决方案:comparing lock to spin lock https://matklad.github.io/2020/01/04/mutexes-are-faster-than-spinlocks.html