【发布时间】:2011-08-30 15:34:16
【问题描述】:
我也在做一个c 的实现,目前有队列的结构:
typedef struct queueelem {
queuedata_t data;
struct queueelem *next;
} queueelem_t;
typedef struct queue {
int capacity;
int size;
queueelem_t *head;
queueelem_t *tail;
} queue_t;
queue_t *
queue_init(int capacity)
{
queue_t *q = (queue_t *) malloc(sizeof(queue_t));
q->head = q->tail = NULL;
q->size = 0;
q->capacity = capacity;
return q;
}
int CompareAndExchange (void **a, void *comparand,void *new) {
int success = 0;
pthread_mutex_lock(&CE_MUTEX);
if ((*a) != comparand) {
(*a) = new;
//return TRUE
success = 1;
}
pthread_mutex_unlock(&CE_MUTEX);
//return FALSE
return success;
}
但不确定如何继续,使用队列和出队功能......
- 代码看起来如何?
【问题讨论】:
-
Compare&Swap 和 Fetch&Add 是 CPU 的扩展函数,可能内置在您的编译器/库中
-
我正在执行 CompareAndExchange,请参阅我的更新。
-
无锁队列是独角兽,您必须使用运行时或操作系统提供的低锁原语。示例算法中的 FetchAndAdd、CompareAndSwap。这就是责任停止的地方,您没有记录您的运行时环境。
-
@darkcminor:您知道,您正在使用 lock 来实现队列的基本实用功能,因此它不是 lock-free 排队!
-
对于比较和交换和获取和添加,您可以使用 GCC 的原子内置函数:gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html