#include <pthread.h>
int main()
{
#if 0
pthread_mutex_t lock;
pthread_mutex_init(&lock,NULL);
#else
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
#endif
pthread_mutex_lock(&lock);
pthread_mutex_unlock(&lock);
return 0;
}
以上是mutex最简单的用法,属快速mutex(fastmutex)。不过这种方式不做错误判断,例如同一个线程加两次锁,或者不同的线程来释放锁也不会有问题,然后这通常隐藏着问题。
#define _GNU_SOURCE
#include <pthread.h>
int main()
{
#if 1
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK_NP);
pthread_mutex_t lock;
pthread_mutex_init(&lock,&attr);
pthread_mutexattr_destroy(&attr);
#else
pthread_mutex_t lock = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
#endif
pthread_mutex_lock(&lock);
pthread_mutex_unlock(&lock);
return 0;
}
我们可以设置robust属性来初始化mutex以避免这个问题.
pthread_mutexattr_setrobust_np(&attr,PTHREAD_MUTEX_ROBUST_NP);