首先std::atomic<std::thread::id>
是合法的:std::thread::id
要求可平凡复制(30.3.1.1p2),满足std::atomic<>
(29.5p1)的要求。
但是,它是一个不透明的类,因此不要求比较相等的对象的位模式相同。
因此,如果您使用compare_exchange_weak
or compare_exchange_strong
then 它可能会因比较相等的值而失败。
因此,建议是compare_exchange_weak
在循环中使用,将expected
值保留为上一次迭代的结果。
在您的情况下,我从您的循环中解释的语义是:保持循环同时worker_id
是另一个线程的 ID,或者worker_id
是std::thread::id
但交换失败。您可以通过以下方式实现此目的:
no_id=std::thread::id();
while((no_id!=std::thread::id()) ||
!worker_id.compare_exchange_weak( no_id, self_id ) ){
if(no_id!=std::thread::id()) no_id=std::thread::id();
sleep();
}
或者
no_id=std::thread::id();
while(!worker_id.compare_exchange_weak(
(no_id!=std::thread::id())?(no_id=std::thread::id())?no_id, self_id ) )
sleep();
即只有在不是时才更改no_id
值。 std::thread::id()