網上很多文章講這個問題,但大多都僅僅是說用Linux下的mutex替代Windows下的CRITICAL_SECTION:pthread_mutex_lock、pthread_mutex_unlock。再說的多一些的,無非是用類的構造和析構函數來封裝一下。
這里忽略了一個很重要的細節,Windows下的Mutex和CRITICAL_SECTION,都是遞歸鎖,而Linux下的pthread_mutex,默認是非遞歸鎖。區別體現在,同一個線程,遞歸鎖可以重入而不阻塞;非遞歸鎖則會阻塞同一個線程的第二次加鎖行為(再第一次釋放鎖之前)。
因此,要在Linux下實現可遞歸的臨界區,這么做:
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&mutex,&attr);
轉載於:http://blog.sina.com.cn/s/blog_484102dd0102w05p.html