我需要一个静态函数的互斥量吗?
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
实在是牵强附会,不一定适用(不过,对计数器来说往往是有好处的)。此处主要用于示例。
我有一个带有静态函数的 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
实在是牵强附会,不一定适用(不过,对计数器来说往往是有好处的)。此处主要用于示例。