【发布时间】:2022-01-15 21:07:33
【问题描述】:
在我的操作系统课程中,我们有一个关于如何修改无锁堆栈代码使其免受竞争条件的练习,但我不明白无锁数据结构如何具有竞争条件以及如何CAS在这里工作。问题是:
compare 和 swap() 指令可用于设计无锁 数据结构,例如堆栈、队列和列表。程序示例 下面显示了无锁堆栈的可能解决方案 使用 CAS 指令,其中堆栈表示为链表 节点元素的顶部表示堆栈的顶部。这个实现没有竞争条件吗?(我无法解决)
typedef struct node {
value t data;
struct node* next;
} Node;
Node* top; // top of stack
void push(value t item)
{
Node* old node;
Node* new node;
new node = malloc(sizeof(Node));
new node->data = item;
do {
old node = top;
new node->next = old node;
} while (compare and swap(top, old node, new node) != old node);
}
value t pop()
{
Node* old node;
Node* new node;
do {
old node = top;
if (old node == NULL)
return NULL;
new node = old node->next;
} while (compare and swap(top, old node, new node) != old node);
return old node->data;
}
【问题讨论】:
-
Node* old node;不是有效的 C++。new node = malloc(sizeof(Node));不是有效的 C++。compare and swap(top, old node, new node)也不是有效的 C++。看起来所示代码中大约有一半的行无法编译。如果您的问题与 C++ 相关,您能否展示真实的 C++ 代码,并针对显示的代码解释您的问题是什么? -
我的主要问题是“这个实现是否没有竞争条件?” @SamVarshavchik
-
是的,竞争条件只影响可以运行的代码。这不会编译(见上面的评论),所以从这个意义上说,它在竞争条件下是微不足道的。
-
谢谢,我忘了。 @dratenik
-
哦,有趣!谢谢你。@dratenik
标签: operating-system