Tag: 无锁

无锁队列实现最终会在压力下产生循环

我有一个用C语言编写的无锁队列,它以链表的forms存在,包含发布到单个线程并在单个线程中处理的多个线程的请求。 经过几个小时的压力后,我最终得到了最后一个请求的下一个指针指向自身,这创建了一个无限循环并锁定了处理线程。 应用程序在Linux和Windows上运行(并失败)。 我在Windows上调试,我的COMPARE_EXCHANGE_PTR映射到InterlockedCompareExchangePointer 。 这是将请求推送到列表头部的代码,并从多个线程调用: void push_request(struct request * volatile * root, struct request * request) { assert(request); do { request->next = *root; } while(COMPARE_EXCHANGE_PTR(root, request, request->next) != request->next); } 这是从列表末尾获取请求的代码,仅由处理它们的单个线程调用: struct request * pop_request(struct request * volatile * root) { struct request * volatile * p; struct request * request; do { p […]