静态互斥和非静态互斥的区别

Different Between Static Mutext and Not Static Mutex

本文关键字:静态 区别      更新时间:2023-10-16

我有一个代码在。cpp

namespapce A
{
    namespace
    {
        static CMutex initMutex;
    }
    void init()
    {
        //code here
    }
    void uninit()
    {
        //code here
    }
}

如果我删除互斥锁中的静态和如果有静态有什么不同?静电有什么用呢?

谢谢!

如果互斥锁是静态的,并且它应该在头文件中,并且头文件包含在2个cpp文件(2个平移单元)中,那么第一个文件中的代码所应用的锁将不会被第二个文件看到,这是危险的。这是因为这两个单元具有单独的互斥锁静态。在这种情况下,全局互斥锁更可取。

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

RAII的例子(基本的一个,东西可以封装到类中):http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

你把C和c++搞混了。C语言中的关键字static的目的是将变量的作用域缩小到翻译单元。您可以在翻译单元中全局地定义它,但是对其他翻译单元是不可见的。Bjarne Stroustrup建议在c++中使用匿名namespaces,而不是像在C中那样使用static

从这篇文章它说

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.

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

static只做两件事:

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

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

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