按值传递(函数范围)静态变量时是否需要添加锁:
假设我有一个函数 - “myfunction”可以由至少 2 个线程调用:
int myfunction()
{
static int var;
function2(var);
return var;
}
void function2(int var)
{
var++;
}
我猜测我们需要一个锁来保护它,或者通过指针传递,并锁定被调用函数内部。因为转换为汇编代码时,至少会进行2次操作:
move REG (var)
push REG
如果第一个线程调用 move,并且第二个线程修改了 var。并且当第一个线程调用push时,它会推送错误的值。
当您传递 2 个字值(64 位)时,情况会变得更糟,传入的高字节和低字节值将不匹配/损坏。
我认为解决方案是通过指针传递并在“function2”中进行互斥锁定和解锁,或者将静态变量分配给局部变量,将局部变量传递给function2,并在赋值之前和之后进行锁定和解锁。
我说得对吗?
最佳答案
您当前的情况并不重要,因为每个线程都到 function2
将获得自己的 var
副本并且增加的值未反射(reflect)在调用者中。
如果要以线程安全的方式递增整型,请使用 ATOMIC_VAR_INIT
中的适当类型 ( atomic_fetch_add
?) 和函数 ( <stdatomic.h>
?) 。编写自己的函数来执行此操作是没有意义的。
关于c - 当按值传递静态变量时会导致 c 中的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35558991/