当按值传递静态变量时导致c

时间:2016-02-22 16:39:42

标签: c multithreading locking mutex static-variables

我需要在按值传递(函数范围)静态变量时添加锁:

假设我有一个功能 - " 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,并在赋值之前和之后执行锁定和解锁。

我说错了吗?

1 个答案:

答案 0 :(得分:1)

您当前的情况并不重要,因为function2的每个帖子都会获得自己的var副本,而增加的值不会反映在来电者中。< / p>

如果要以线程安全的方式递增整数类型,请使用ATOMIC_VAR_INIT中的相应类型(atomic_fetch_add?)和函数(<stdatomic.h>?)。编写自己的函数没有必要这样做。