互斥量可重入(可复入)的概念是:同一个线程,进入一互斥量后,不出此互斥量而再次进入此互斥量,线程不会死等。
pthread_mutex_init调用时第二个参数传入NULL,即为默认的mutex初始化方式。请记住,这种默认的初始化的方式,生成的是不可重入的互斥量,即同线程重复进入会死等(或叫死锁)。这与Windows上InitializeCriticalSection初始化恰相反。
要pthread_mutex_t可重入,需要使用PTHREAD_MUTEX_RECURSIVE_NP参数,具体见本文后所附源码。
本人已抽象出跨平台的互斥量源码库,其中的互斥量都是可重入的,在Linux和Windows上都可以统一调用,先说使用举例。
定义:
1 | WhMutex mutex_; |
初始化:
1 | whMutexInit(&mutex_); |
反初始化:
1 | whMutexFini(&mutex_); |
当要把一段代码设为临界段时:
1 2 3 4 5 | { WhMutexGuard guard(&mutex_); // your critical section code here. int i; } |
以下是抽象互斥量库源码(直接复制过去就可编译):