Multithreading 原子交换(读写)操作的用例是什么?
C++0x为变量的线程安全原子访问指定Multithreading 原子交换(读写)操作的用例是什么?,multithreading,language-agnostic,c++11,atomic,atomicity,Multithreading,Language Agnostic,C++11,Atomic,Atomicity,C++0x为变量的线程安全原子访问指定std::atomic模板。除其他外,该模板还有一个成员函数,该函数以原子方式将新值存储在“This”中,并检索“This”的现有值 Win32具有类似的功能: 现在,这些操作做的很简单:原子读取修改 我不明白的是这次行动的目的是什么。读取返回的值是“无意义的”,因为一旦我可以检查返回值,另一个线程可能已经覆盖了它 那么这个用例是什么呢?在我将新值写入变量之前,哪个值的信息能告诉我什么 注意:比较交换/联锁比较交换语义对我来说是有意义的,但不是简单的交换语义
std::atomic
模板。除其他外,该模板还有一个成员函数,该函数以原子方式将新值存储在“This”中,并检索“This”的现有值
Win32具有类似的功能:
现在,这些操作做的很简单:原子读取修改
我不明白的是这次行动的目的是什么。读取返回的值是“无意义的”,因为一旦我可以检查返回值,另一个线程可能已经覆盖了它
那么这个用例是什么呢?在我将新值写入变量之前,哪个值的信息能告诉我什么
注意:比较交换
/联锁比较交换
语义对我来说是有意义的,但不是简单的交换语义。您典型的自旋锁:
std::atomic<bool> lock; // initialize to false
{ // some critical section, trying to get the lock:
while (lock.exchange(true)) { } // now we have the lock
/* do stuff */
lock = false; // release lock
}
std::原子锁;//初始化为false
{//某个关键部分,正在尝试获取锁:
虽然(lock.exchange(true)){}//现在我们有了锁
/*做事*/
lock=false;//释放锁
}
查看Herb Sutter的真实应用程序。nvm最后一点(没有思考:p),但要小心Herb的Dobbs博士的旧文章,有些文章发现有严重缺陷(由Herb自己发现)@Necrolis:事实上,这篇文章本身是对其他人之前错误文章的更正的后续。(再一次,有些人甚至试图争辩说,你根本不需要原子,只需要用一个标准bool来伪造互斥,可能会变得易变:-)根据intels x86手册,你可以/可以(见第3A卷第8.1节),但使用适当的原子是唯一的办法:)@Necrolis:我不相信。假设
lock
为false。你在(!lock)时说编码>并移动超过该点。同时,另一个线程也执行相同的操作。只有现在才能将lock
设置为true。现在,两个线程同时移动到同一个关键部分。@Necrolis:如果您的线程在退出循环后但在分配之前被抢占了怎么办?另一个等待的线程现在也可以退出循环并“获取”锁。如果没有它,您将如何实现无锁交换?