我正在尝试从实现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
我知道阻塞队列和无锁队列,这是提供的实现的一个很好的例子,但是有无锁阻塞队列的实现吗?
在无锁阻塞队列中,去队列将不需要锁定,但是如果队列中没有项,它将阻塞使用者。这样的野兽有什么实现吗?我更希望它们是C#实现,但是任何实现在技术上都是可行的。
更新:
我想我在D14.1线上的比赛条件是:
initialize(Q: pointer to queue t)
node = new node() // Allocate a free node
node–>next.ptr = NULL // Make it the only node in the linked list
Q–>Hea
假设CompareAndSwap (或归档存储)从未出现虚假故障,那么CompareExchange可以与归档存储一起实现吗?
CompareExchange都接受一个指针、一个预期值和一个新值,如果指针引用的内存与预期值匹配,它会自动将指针引用的内存设置为新值。两者之间的区别在于,CompareExchange返回内存区的前一个值,而CompareAndSwap返回指示成功或失败的布尔值。
用CompareExchange实现CAS是很简单的:
int CompareExchange (int* p, int expected, int newvalue);
bool CAS (int*
我正在尝试使用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()
最近,我在创建一个生产可重用实例的工厂时遇到了一种情况。
public class Factory {
private static final int REUSABLE_TIMES_LIMIT = 10;
private static Product instance = new Product();
private static int getTimes;
public static synchronized Product getInstance() {
if (++getTimes >= REUSABLE_TIMES_LIMIT)