c - 当按值传递静态变量时会导致 c 中的竞争条件

标签 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时,它会推送错误的值。

当您传递 2 个字值(64 位)时,情况会变得更糟,传入的高字节和低字节值将不匹配/损坏。

我认为解决方案是通过指针传递并在“function2”中进行互斥锁定和解锁,或者将静态变量分配给局部变量,将局部变量传递给function2,并在赋值之前和之后进行锁定和解锁。

我说得对吗?

最佳答案

您当前的情况并不重要,因为每个线程都到 function2将获得自己的 var 副本并且增加的值反射(reflect)在调用者中。

如果要以线程安全的方式递增整型,请使用 ATOMIC_VAR_INIT 中的适当类型 ( atomic_fetch_add ?) 和函数 ( <stdatomic.h> ?) 。编写自己的函数来执行此操作是没有意义的。

关于c - 当按值传递静态变量时会导致 c 中的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35558991/

相关文章:

c# - 如何将诊断添加到 C# 锁定功能以进行多线程调试

c++ - 正确锁定从多个线程调用其自己的成员函数的类。 (我需要锁定访问 "this"指针吗?)

c - 系统函数调用异步?

c - 使用宏 MINIMUM3 的三个数字中最小的一个

c - 如何在 C 中存储链表列表?

c - HTTP协议(protocol): end of a message body

c# 多线程内存使用 - 应用程序变慢和 CPU 使用率下降

python - 在后台接收 UDP 数据包(PYTHON)

multithreading - 在 core.async 中阻塞与线程

concurrency - Redis 出队时处于 'parking to wait' 状态的线程