gpt4 book ai didi

c++ - G++ CAS (__sync_val_compare_and_swap) 问题需要解释

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:13 25 4
gpt4 key购买 nike

这让我很头疼。

我正在尝试实现一些“无锁”代码并使用 CAS (gcc __sync_val_compare_and_swap) 来完成繁重的工作。

我的问题可以用下面的代码显示。

volatile bool lock;
void *locktest( void *arg )
{
for ( int i = 0 ; i < 100000 ; ++i )
{
// acquire a lock
while( __sync_val_compare_and_swap( &lock, false, true ) == true )
{
// Spin while we don't acquire
}

// make sure we have the lock
assert( lock == true );

// release the lock
assert( __sync_val_compare_and_swap( &lock, true, false ) == true );
}
}

好的,如果我在 10 个并发线程中运行上面的代码,一切都很好。

但是,如果我将代码改为阅读

        // acquire a lock
while( __sync_val_compare_and_swap( &lock, lock, true ) == true )

请注意,我已将“false”更改为“lock”。

一切都乱套了,断言

        // make sure we have the lock
assert( lock == true );

着火。谁能解释为什么这会产生影响?

谢谢马克。

最佳答案

在我看来,__sync_val_compare_and_swap 将始终返回变量的旧值,即使没有发生交换。在这种情况下,假设另一个线程在您尝试获取它之前持有锁 - 然后 lock 为真,并且您正在调用 __sync_val_compare_and_swap(&lock, true, true);。就在实际的原子比较和交换之前(但在确定函数参数之后),另一个线程释放锁 - lock 变为 false。 compare_and_swap 将返回 false,但不会执行 swap 操作,因为它比较的值不是锁中的值。此线程未执行交换,因此 lock 的值保持为 false,从而触发您的断言。

顺便说一句,我强烈建议将 lock 设为 volatile bool。您不希望编译器优化对此类变量的引用。

关于c++ - G++ CAS (__sync_val_compare_and_swap) 问题需要解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2140536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com