我需要帮助理解与关系的同步.我读的越多,试图理解的例子,我越觉得我什么都不懂.有时候我觉得这就是它,我已经知道了,但在看了另一个例子之后我再次感到困惑.请帮我把它弄好.
如果A是某个原子变量m的存储,则表示操作A与操作B同步,具有释放语义,B是来自相同变量m的加载,具有获取语义,B读取由A存储的值.还有人说操作A发生在操作B之前
好.如果我们看一下这个例子
thread0执行| thread1执行
商店x(发布)| 加载x(获取)
存储到x这里同步 - 来自x的负载?如果我们确实在这里有同步关系,那么在从x加载之前就存储到x,所以在线程0中存储到x之前排序的所有内容都会发生 - 在从线程1中的x加载之前发生.这意味着这里有强制排序.这样对吗?但在这种情况下,我不明白"和B读取A存储的值"的定义是什么意思?如果线程1比线程0快,则它可以读取旧值.那么这里的关系是什么,是否有任何关系?如果没有,我该如何提供这种关系?
提前致谢.
我读了一篇文章,描述了ABA问题,但有些东西,我无法理解.我有源代码,它无法工作,它类似于文章中的示例,但我不明白这个问题.这是文章
http://fara.cs.uni-potsdam.de/~jsg/nucleus/index.php?itemid=6
它说:虽然head_的实际值是相同的(a)next_指针是NOT
但它怎么可能呢?如果是两个结构对象
struct node {
node *next;
data_type data;
};
Run Code Online (Sandbox Code Playgroud)
"head_"和"current"指向内存中的同一区域,如何头_-> next和current-> next指向不同?
它还说:最后一个操作,foo SUCCEEDS的比较和交换,它不应该.
那该怎么办?加载相同的地址,然后重试?有什么不同?
目前在我的代码中我有类似的情况,我在对象上做CompareAndSwap,可能会被另一个线程更改为具有类似地址的对象
deleted.compare_exchange_strong(head, 0);
Run Code Online (Sandbox Code Playgroud)
但是如果更改的对象被初始化很好并且它的下一个指针包含指向初始化对象的指针那么问题是什么?
提前致谢.