静态互斥锁与非静态互斥锁之间的区别

时间:2013-04-05 08:08:13

标签: c++ mutex

我在.cpp中有代码

namespapce A
{
    namespace
    {
        static CMutex initMutex;
    }

    void init()
    {
        //code here
    }

    void uninit()
    {
        //code here
    }
}

如果删除互斥锁中的静态并且是否存在静态,有什么不同?静态的用途是什么?

谢谢!

3 个答案:

答案 0 :(得分:5)

如果互斥锁是静态的,并且它位于标题中并且该标题包含在2个cpp文件中(2个转换单位),则第一个文件中的代码所应用的锁将不会被第二个文件看到,这是危险的。这是因为2个单元具有互斥的单独静态。在这种情况下,最好使用全局互斥。

如果这是C ++,那么使用RAII机制来管理互斥锁和解锁。这是c ++,哪个类?将事物封装成一个类。

RAII示例(基本的,事情可以封装到类中): http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

答案 1 :(得分:2)

你有点混淆C和C ++。 C中的关键字static旨在将变量的范围缩小到翻译单元。您可以在翻译单元中全局定义它,但其他翻译单元不可见。 Bjarne Stroustrup建议在C ++中使用匿名namespaces,而不是像C中那样使用static

this发帖说

C ++标准中的第7.3.1.1节“未命名的命名空间”第2节:

The use of the static keyword is deprecated when declaring objects 
in a namespace scope, the unnamed-namespace provides a superior alternative.

静态仅适用于对象,函数和匿名联合的名称,而不适用于类型声明。

答案 2 :(得分:2)

static只做两件事:

  • 使一个变量在程序的整个生命周期中存在(但这是全局级别的,所以这里存在整个程序生命周期!)

  • 使变量仅在声明的翻译单元中可见(但这适用于匿名命名空间中的任何内容)。

所以,事实上,在这个特定背景下 静态无效