我正在尝试从实现Michael-Scott FIFO队列。我无法实现他们对ABA问题的解决方案。我得到了这个错误。
error: incompatible type for argument 1 of '__sync_val_compare_and_swap'
作为参考,我使用linux机器在英特尔架构上编译这段代码。如果您需要更多关于我的设置的信息,请联系我。
sync_val_CAS似乎只能处理最多32位的值。因此,当我删除用于消除ABA问题的计数器时,一切都编译并运行良好。
有人知道我应该在这里使用的相关64位CAS指令吗?
另一个问题是,是否有更好(更快)的无锁fifo
我正在尝试使用G3Log ( Google logger -glog的一个版本)在静态库中做一些日志记录。在我尝试将该静态库放入C++/CLI托管包装器之前,一切都运行得很好。当我这样做的时候,我得到了可怕的问题:
error C1189: #error : <mutex> is not supported when compiling with /clr or /clr:pure.
问题是接收器的回调函数需要g2::LogMessageMover,要做到这一点,我必须带回头文件。那么,如何封装glog.hpp标头,使其对C++/CLI应用程序不可见呢?
这是我尝试过的方法,但我被
如何在C中实现这种无锁队列伪代码
ENQUEUE(x)
q ← new record
q^.value ← x
q^.next ← NULL
repeat
p ← tail
succ ← COMPARE&SWAP(p^.next, NULL, q)
if succ ≠ TRUE
COMPARE&SWAP(tail, p, p^.next)
until succ = TRUE
COMPARE&SWAP(tail,p,q)
end
DEQUEUE()
我遇到了一个问题,我不确定它是否能以我想要解决的方式解决。我的种族状况有问题。
我有一个项目运行作为一个C++ dll (主机)。然后,我有了第二个C#进程,它使用C++/CLI与主引擎(编辑器)通信。
编辑器将引擎窗口作为子窗口承载。其结果是子窗口接收输入消息异步(请参阅RiProcessMouseMessage())。通常,只有当我调用window->PollEvents();时才会发生这种情况。
main engine loop {
RiProcessMouseMessage(); // <- Called by the default windows message
据我理解
block is there are =1 task could progress if there are N tasks concurrent running
and one enter the critical area(enter the critical area one).
lock-free is there are >=1 tasks could progress if there are N tasks concurrent
running and one enter the critical area.
wait-free is there are
我正在尝试实现单个生产者(主线程)和单个使用者(从Main派生的子线程)问题,因此根据我的搜索,我得到了spsc_queue作为boost库提供的最好的无锁数据结构。从它们的示例代码中可以看出,使用者函数如下所示:
void consumer(void)
{
int value;
while (!done) {
while (queue.pop(value))
++consumer_count;
}
while (queue.pop(value))
++consumer_count;
}
现在,可能发生的