C++ 在已锁定的pthread\u mutex\t上执行pthread\u mutex\u init时会发生什么?

C++ 在已锁定的pthread\u mutex\t上执行pthread\u mutex\u init时会发生什么?,c++,multithreading,pthreads,mutex,C++,Multithreading,Pthreads,Mutex,我的互斥类定义如下:- class Mutex{ static pthread_mutex_t mutex; public: Mutex(){ pthread_mutex_init(&mutex, NULL); while(pthread_mutex_trylock(&mutex)){ sleep(2000); } } virtual ~Mutex(){ pth

我的互斥类定义如下:-

class Mutex{
    static pthread_mutex_t mutex;
public:
    Mutex(){
        pthread_mutex_init(&mutex, NULL);
        while(pthread_mutex_trylock(&mutex)){
            sleep(2000);
        }
    }
    virtual ~Mutex(){
        pthread_mutex_unlock(&mutex);
        pthread_mutex_destroy(&mutex);
    }
};
我尝试应用互斥函数来使用此类,如下所示:-

void doSomething(){
    Mutex mutex;
    // do something
}
这样,当调用构造函数时,互斥锁被初始化,并尝试获取该互斥锁上的锁。当它超出该函数的作用域时,它会自动被销毁

但是,如果一个线程在互斥锁上有一个锁,另一个线程尝试在其上运行
pthread\u mutex\u init
,到底会发生什么?具有锁的线程将被覆盖吗?

非常简单,来自:

尝试初始化已初始化的互斥锁会导致未定义的行为

这就是为什么有另一种初始化互斥体的方法:

// in your .cpp somewhere
pthread_mutex_t Mutex::mutex = PTHREAD_MUTEX_INITIALIZER;

除此之外,从逻辑上讲,你的课似乎很有问题。您真的想为所有
互斥对象的用户(无论他们在做什么)设置一个全局锁吗?您应该使用细粒度锁,否则您将通过以下方式人为限制自己的可伸缩性。

非常简单:

尝试初始化已初始化的互斥锁会导致未定义的行为

这就是为什么有另一种初始化互斥体的方法:

// in your .cpp somewhere
pthread_mutex_t Mutex::mutex = PTHREAD_MUTEX_INITIALIZER;


除此之外,从逻辑上讲,你的课似乎很有问题。您真的想为所有
互斥对象的用户(无论他们在做什么)设置一个全局锁吗?你应该使用细粒度的锁,否则你会通过。

鼻魔来人为地限制你自己的可伸缩性,当然。未定义的行为。答案是答案的简称:))我试图弄清楚这个实现可能带来什么好处,但我找不到任何好处。另外,除非您仍在C++11之前的土地上,否则我看不出有任何理由不使用线程支持库和其他产品。@WhozCraig我的软件需要支持其他仍在C++11之前土地上的软件。这是一项设计要求。因此这个实现。围绕
pthread\u mutex\u trylock()
的循环是愚蠢的:只需调用
pthread\u mutex\u lock()
,而不调用循环。当然是鼻魔。未定义的行为。答案是答案的简称:))我试图弄清楚这个实现可能带来什么好处,但我找不到任何好处。另外,除非您仍在C++11之前的土地上,否则我看不出有任何理由不使用线程支持库和其他产品。@WhozCraig我的软件需要支持其他仍在C++11之前土地上的软件。这是一项设计要求。因此这个实现。围绕
pthread\u mutex\u trylock()
的循环很愚蠢:只需调用
pthread\u mutex\u lock()
,而不调用循环。这只是我提出的一个互斥示例,程序的一小部分将使用它。这个实现需要有一个全局锁。这只是我举的一个互斥锁示例,它将被程序的一小部分使用。这个实现需要有一个全局锁。