2

我在 .cpp 中有一个代码

namespapce A
{
    namespace
    {
        static CMutex initMutex;
    }

    void init()
    {
        //code here
    }

    void uninit()
    {
        //code here
    }
}

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

谢谢!

4

3 回答 3

5

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

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

RAII 例子(基础一,东西可以封装成类): http ://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

于 2013-04-05T08:31:17.167 回答
2

static 只做两件事:

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

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

所以,事实上,在这个特定的上下文中static 什么都不做

于 2013-04-05T08:41:53.673 回答
2

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

这篇文章中它说

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.

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

于 2013-04-05T08:24:24.720 回答