我需要一个静态函数的互斥量吗?

Do i need a mutex for a static function?

我有一个带有静态函数的 C++ class:

class Foo
{
public:
    static void bar(int &a)
    {
        a++;
    }
}

编辑:
作为参数传递的变量仅在调用范围内使用。所以它不会被另一个线程访问。

当我从单独的线程调用此函数时,是否必须使用 mutex

谢谢。

调用该函数只需要线程局部资源,线程栈。因此答案是否定的。如果 int 变量可以被多个调用线程访问,则变量

需要一个 mutex

函数是否 static 与调用它是否需要同步无关。

决定因素是函数是否可重入,以及你对数据做了什么。在这种情况下,函数 可重入的(因为它自己没有非本地状态,或者实际上根本没有任何状态),数据是 owned/managed 由调用范围决定,因此您必须在调用范围内决定该整数是否需要保护。

但无论 bar 是静态成员、非静态成员、自由函数、宏、猫、黑洞还是 Jon Skeet 的滚筒式烘干机,都是如此。

我想提一下,互斥量并不是唯一可用的线程同步原语,在某些情况下远非最合适的原语。

如果需要同步(请参阅其他两个答案,了解为什么可能需要它,具体取决于使用情况)不要跳入互斥锁世界。对于像计数器这样直接的东西(这是我在代码中看到的)atomic 变量(或者,在没有这些变量的情况下,对非原子类型的原子操作)通常提供更好的性能和更直接的代码。

在这种特殊情况下,可以使用以下 C++11 代码以线程安全的方式轻松地增加变量:

static void bar(std::atomic<int>& a)
{
    a.fetch_add(1, std::memory_order_relaxed);
}
这里用的

memory_order_relaxed实在是牵强附会,不一定适用(不过,对计数器来说往往是有好处的)。此处主要用于示例。