我需要在按值传递(函数范围)静态变量时添加锁:
假设我有一个功能 - " 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时,它将推送错误的值。
当你传递双字值(64位)时,情况变得更糟,传入的高字节和低字节值将不匹配/损坏。
我认为解决方案是通过指针传递并在" function2"中进行互斥锁定和解锁。或者将静态变量赋值给局部变量,将局部变量传递给function2,并在赋值之前和之后执行锁定和解锁。
我说错了吗?
答案 0 :(得分:1)
您当前的情况并不重要,因为function2
的每个帖子都会获得自己的var
副本,而增加的值不会反映在来电者中。< / p>
如果要以线程安全的方式递增整数类型,请使用ATOMIC_VAR_INIT
中的相应类型(atomic_fetch_add
?)和函数(<stdatomic.h>
?)。编写自己的函数没有必要这样做。