我有一个静态功能的C++类:我需要一个静态函数的互斥量吗?
class Foo
{
public:
static void bar(int &a)
{
a++;
}
}
编辑:
作为参数传递的变量仅主叫范围内使用。所以它不被另一个线程访问。
当我从一个单独的线程调用这个函数时,我必须使用mutex
吗?
谢谢。
我有一个静态功能的C++类:我需要一个静态函数的互斥量吗?
class Foo
{
public:
static void bar(int &a)
{
a++;
}
}
编辑:
作为参数传递的变量仅主叫范围内使用。所以它不被另一个线程访问。
当我从一个单独的线程调用这个函数时,我必须使用mutex
吗?
谢谢。
调用此函数只需要线程本地资源,即线程堆栈。因此答案是否定的。如果int变量可以通过多于调用线程访问,则将需要一个mutex
用于变量
函数是否为static
对于是否需要对其调用进行同步没有任何影响。
决定性因素是函数是否可重入以及您对数据做了什么。在这种情况下,函数是重入(因为它本身没有非本地状态,或者实际上没有任何状态),并且数据由调用范围拥有/管理,因此您将拥有在调用范围内决定该整数是否需要保护。
但是,无论bar
是静态成员,非静态成员,自由函数,宏,猫还是黑洞,还是Jon Skeet的滚筒式烘干机,都是如此。
我想提一下,互斥量不是唯一可用的线程同步原语,在某些情况下远离最合适的线程同步原语。
需要提供同步(请参阅另外两个关于为什么需要根据使用情况需要的答案),请勿进入互斥体世界。对于像计数器那样直截了当的东西(这是我在代码中看到的)原子变量(或者在没有这些变量的情况下,对非原子类型进行原子操作)通常会提供更好的性能和更直接的代码。
在这种特殊情况下,增加一个变量可以很容易地在线程安全的方式完成与下面的C++代码11:
static void bar(std::atomic<int>& a)
{
a.fetch_add(1, std::memory_order_relaxed);
}
这里使用memory_order_relaxed
实在是牵强的,而不是neccessarily适用(然而,对于柜台来说通常是好的)。这里主要用于这个例子。
取决于'a'在别处如何使用。 a'可以是任何'int'吗?如果它可以是任何东西,你如何正确地保护它?在调用'bar'之前,你可能需要使用你的锁。 – Simple
答案相当复杂,除非您可以提供有关如何使用此功能的更多信息。传入此函数的变量需要保护,而不是函数本身。 – Galik
@Galik:你的第二句反驳你的第一句,因为这个问题的答案非常简单。 –