【发布时间】:2011-05-18 12:20:45
【问题描述】:
假设我们有一个线程安全的比较和交换函数,例如long CAS(long * Dest ,long Val ,long Cmp)
比较 Dest 和 Cmp,如果比较成功,则将 Val 复制到 Dest 并以原子方式返回 Dest 的原始值。
所以我想问问你下面的代码是否是线程安全的。
while(true)
{
long dummy = *DestVar;
if(dummy == CAS(DestVar,Value,dummy) )
{
break;
}
}
编辑:
Dest 和 Val 参数是指向在堆上创建的变量的指针。
InterlockedCompareExchange 是 CAS 函数的一个例子。
【问题讨论】:
-
这是 C# 还是 C++?请选择一个。
-
当然可以。一个是本地的,另一个不是。他们对不同操作的原子性有不同的承诺。
-
@Oded:CAS 的重点是确保考虑原子性。
-
此外,C++ 没有任何原子性承诺
标签: c++ multithreading concurrency thread-safety