首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无锁队列

无锁队列
EN

Stack Overflow用户
提问于 2011-05-22 15:48:51
回答 5查看 7.4K关注 0票数 3

另外,我正在执行一个c实现,并且当前具有队列的结构:

代码语言:javascript
运行
复制
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;
 }

但不知道如何继续,用队列和去队列函数.

  • 代码会是什么样子?
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-05-22 16:05:00

您的伪代码可能(而且很可能)会受到ABA问题的影响,因为只有指针被检查,而不是伴随的唯一邮票,因此您会发现在这方面使用的本论文,以及作为无锁队列实现的通用指南,以及它的缺陷。

在处理无锁编程时,读一读Herb Sutter的作品也是个好主意,因为他给出了很好的、有洞察力的解释,说明了需要什么,为什么需要它,以及它的潜在弱点(不过要注意,他的一些旧出版物/文章中发现了一些隐藏的/不可见的问题)。

票数 2
EN

Stack Overflow用户

发布于 2011-05-22 18:46:21

还有最近关于这个话题的讨论:slides.pdf

票数 2
EN

Stack Overflow用户

发布于 2020-01-06 19:33:49

不久前,我发现很好的解决方案解决了这个问题。我相信这是迄今为止发现的最小的。

存储库有一个示例,说明如何使用它创建N个线程(读取器和作者),然后共享一个席位。

在测试示例中,我做了一些基准测试,得到了以下结果(以百万运算程序/秒计):

按缓冲器大小

按线程数

注意线程数如何不改变吞吐量。

我认为这是这个问题的最终解决办法。它的工作,是令人难以置信的快速和简单。即使有数百个线程和一个位置的队列。它可以用作线程之间的管道,在队列中分配空间。

存储库有一些用C#和pascal编写的早期版本。我正在努力使一些更完整的抛光,以显示其真正的力量。

我希望你们中的一些人能够验证这项工作,或者在一些想法上有所帮助。或者至少你能打破它吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6089029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档