Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 原子交换(读写)操作的用例是什么?_Multithreading_Language Agnostic_C++11_Atomic_Atomicity - Fatal编程技术网

Multithreading 原子交换(读写)操作的用例是什么?

Multithreading 原子交换(读写)操作的用例是什么?,multithreading,language-agnostic,c++11,atomic,atomicity,Multithreading,Language Agnostic,C++11,Atomic,Atomicity,C++0x为变量的线程安全原子访问指定std::atomic模板。除其他外,该模板还有一个成员函数,该函数以原子方式将新值存储在“This”中,并检索“This”的现有值 Win32具有类似的功能: 现在,这些操作做的很简单:原子读取修改 我不明白的是这次行动的目的是什么。读取返回的值是“无意义的”,因为一旦我可以检查返回值,另一个线程可能已经覆盖了它 那么这个用例是什么呢?在我将新值写入变量之前,哪个值的信息能告诉我什么 注意:比较交换/联锁比较交换语义对我来说是有意义的,但不是简单的交换语义

C++0x为变量的线程安全原子访问指定
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:如果您的线程在退出循环后但在分配之前被抢占了怎么办?另一个等待的线程现在也可以退出循环并“获取”锁。如果没有它,您将如何实现无锁交换?