当我在已经锁定的pthread_mutex_t上执行pthread_mutex_init时会发生什么?

Sid*_*hay 0 c++ multithreading mutex pthreads

我的互斥类定义如下: -

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);
    }
};
Run Code Online (Sandbox Code Playgroud)

我试图应用互斥的函数使用这个类如下: -

void doSomething(){
    Mutex mutex;
    // do something
}
Run Code Online (Sandbox Code Playgroud)

这样,当调用构造函数时,互斥锁被初始化并尝试获取该互斥锁上的锁.当它超出该函数的范围时,它会自动被破坏.

但是如果一个线程锁定了互斥锁,另一个线程会尝试pthread_mutex_init在其上运行,究竟会发生什么?是否会覆盖具有锁定的线程?

pep*_*ppe 5

非常简单,来自POSIX.1-2013:

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

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

// in your .cpp somewhere
pthread_mutex_t Mutex::mutex = PTHREAD_MUTEX_INITIALIZER;
Run Code Online (Sandbox Code Playgroud)

除此之外,从逻辑上讲,你的课程似乎非常值得怀疑.你真的想为所有用户提供一个全局锁定Mutex,无论他们在做什么吗?您应该使用细粒度锁,否则您将通过软件锁定人为地限制自己的可扩展性.