2016-04-08 33 views
1

我有一个静态功能的C++类:我需要一个静态函数的互斥量吗?

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

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

当我从一个单独的线程调用这个函数时,我必须使用mutex吗?

谢谢。

+1

取决于'a'在别处如何使用。 a'可以是任何'int'吗?如果它可以是任何东西,你如何正确地保护它?在调用'bar'之前,你可能需要使用你的锁。 – Simple

+0

答案相当复杂,除非您可以提供有关如何使用此功能的更多信息。传入此函数的变量需要保护,而不是函数本身。 – Galik

+0

@Galik:你的第二句反驳你的第一句,因为这个问题的答案非常简单。 –

回答

8

调用此函数只需要线程本地资源,即线程堆栈。因此答案是否定的。如果int变量可以通过多于调用线程访问,则将需要一个mutex用于变量

3

函数是否为static对于是否需要对其调用进行同步没有任何影响。

决定性因素是函数是否可重入以及您对数据做了什么。在这种情况下,函数重入(因为它本身没有非本地状态,或者实际上没有任何状态),并且数据由调用范围拥有/管理,因此您将拥有在调用范围内决定该整数是否需要保护。

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

+0

只是好奇。你为什么改变你的名字而不是回复它? – SergeyA

+0

我知道。并不意味着它在一夜之间翻转过来。问题依然存在。 – SergeyA

+0

够公平的。就像我说的,只是好奇。 – SergeyA

0

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

需要提供同步(请参阅另外两个关于为什么需要根据使用情况需要的答案),请勿进入互斥体世界。对于像计数器那样直截了当的东西(这是我在代码中看到的)原子变量(或者在没有这些变量的情况下,对非原子类型进行原子操作)通常会提供更好的性能和更直接​​的代码。

在这种特殊情况下,增加一个变量可以很容易地在线程安全的方式完成与下面的C++代码11:

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

这里使用memory_order_relaxed实在是牵强的,而不是neccessarily适用(然而,对于柜台来说通常是好的)。这里主要用于这个例子。

相关问题