另外,我正在执行一个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;
}
但不知道如何继续,用队列和去队列函数.
发布于 2011-05-22 16:05:00
您的伪代码可能(而且很可能)会受到ABA问题的影响,因为只有指针被检查,而不是伴随的唯一邮票,因此您会发现在这方面使用的本论文,以及作为无锁队列实现的通用指南,以及它的缺陷。
在处理无锁编程时,读一读Herb Sutter的作品也是个好主意,因为他给出了很好的、有洞察力的解释,说明了需要什么,为什么需要它,以及它的潜在弱点(不过要注意,他的一些旧出版物/文章中发现了一些隐藏的/不可见的问题)。
发布于 2011-05-22 18:46:21
还有最近关于这个话题的讨论:slides.pdf
发布于 2020-01-06 19:33:49
不久前,我发现很好的解决方案解决了这个问题。我相信这是迄今为止发现的最小的。
存储库有一个示例,说明如何使用它创建N个线程(读取器和作者),然后共享一个席位。
在测试示例中,我做了一些基准测试,得到了以下结果(以百万运算程序/秒计):
按缓冲器大小
按线程数
注意线程数如何不改变吞吐量。
我认为这是这个问题的最终解决办法。它的工作,是令人难以置信的快速和简单。即使有数百个线程和一个位置的队列。它可以用作线程之间的管道,在队列中分配空间。
存储库有一些用C#和pascal编写的早期版本。我正在努力使一些更完整的抛光,以显示其真正的力量。
我希望你们中的一些人能够验证这项工作,或者在一些想法上有所帮助。或者至少你能打破它吗?
https://stackoverflow.com/questions/6089029
复制相似问题