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

What happens when I do a pthread_mutex_init on an already locked pthread_mutex_t?

本文关键字:pthread mutex init 执行 什么 锁定      更新时间:2023-10-16

我的互斥类被定义:-

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_mutex_init,究竟会发生什么?具有锁的线程会被覆盖吗?

非常简单,从POSIX.1-2013:

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

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

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

除此之外,从逻辑上讲,你的班级似乎很可疑。您是否真的希望为Mutex的所有用户使用一个全局锁,无论他们在做什么?您应该使用细粒度锁,否则您将通过软件锁定人为地限制自己的可扩展性。