如何确保多线程将两个值分别推入两个无锁队列在一个原子操作中而不在C ++中使用锁?

问题描述

我正试图找出一种方法,将两个值压入两个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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...