我有一个带有静态函数的C ++类:
class Foo
{
public:
static void bar(int &a)
{
a++;
}
}
修改
作为参数传递的变量仅在调用范围内使用。所以它不被另一个线程访问。
当我从一个单独的线程中调用此函数时,是否必须使用mutex
?
感谢。
答案 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
确实很牵强,并且不一定适用(但通常对于计数器来说是好的)。这里主要用于示例。