我需要一个互斥体来实现静态功能吗?

时间:2016-04-08 10:53:24

标签: c++ multithreading thread-safety mutex

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

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

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

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

感谢。

3 个答案:

答案 0 :(得分:9)

调用此函数只需要线程本地资源,即线程堆栈。因此答案是否定的。如果int变量可以被多个调用线程访问,那么变量

需要mutex

答案 1 :(得分:5)

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

决定因素是函数是否可重入,以及您对数据执行的操作。在这种情况下,函数可重入(因为它没有自己的非本地状态,或者实际上根本没有任何状态),并且数据由调用范围拥有/管理,因此您必须在调用范围内决定该整数是否需要保护。

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

答案 2 :(得分:0)

我想提一下,mutex并不是唯一可用的线程同步原语,并且在某些情况下远非大多数可用的原型。

需要同步(请参阅另外两个答案,了解根据使用情况可能需要的原因)不要跳进互斥锁世界。对于像计数器那样严格的东西(这是我在代码中看到的)原子变量(或者,如果没有那些,非原子类型的原子操作)通常会提供更好的性能和更直接​​的代码。

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

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

memory_order_relaxed确实很牵强,并且不一定适用(但通常对于计数器来说是好的)。这里主要用于示例。