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

Mar*_* Ba 7 language-agnostic multithreading atomic atomicity c++11

C++ 0x指定std::atomic用于线程安全原子访问变量的模板.此模板包含一个成员函数std :: atomic :: exchange,它以"this"原子方式存储一个新值,并检索"this"的现有值.

Win32有类似的功能: InterlockedExchange

现在,这些操作的作用很简单:原子读取 - 修改.

我不明白的是这个操作的重点是什么.返回的值是"无意义的",因为一旦我可以检查返回值,另一个线程可能已经覆盖了它.

那么这个用例是什么?在我将新值写入变量之前,有哪些值的信息可以告诉我什么?

注意:compare_exchange/ InterlockedCompareExchange语义对我有意义,但不是简单的交换语义.

Ker*_* SB 10

你典型的螺旋锁:

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
}
Run Code Online (Sandbox Code Playgroud)

查看Herb Sutter的实际应用程序的等待队列.

  • @Necrolis:我不相信.假设`lock`为假.你说`while(!lock);`然后移过那一点.同时,另一个线程也是如此.只有现在才能将`lock`设置为true.现在两个线程一次进入同一个关键部分. (2认同)