我想知道是否可以使用互斥锁自己制作递归互斥锁类型,PTHREAD_MUTEX_ERRORCHECK
结果如下:
typedef struct {
pthread_mutex_t mutex;
uint32_t deadlocks;
} pthread_recursivemutex_t;
int pthread_recursivemutex_init(pthread_recursivemutex_t *mutex)
{
int ret;
pthread_mutexattr_t attr;
mutex->deadlocks = 0;
ret = pthread_mutexattr_init(&attr);
if (ret != 0) {
return ret;
}
(void)pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
ret = pthread_mutex_init(&mutex->mutex, &attr);
(void)pthread_mutexattr_destroy(&attr);
return ret;
}
void pthread_recursivemutex_lock(pthread_recursivemutex_t *mutex)
{
int ret;
ret = pthread_mutex_lock(&mutex->mutex);
if (ret == 0) {
mutex->deadlocks = 0;
} else if (ret == EDEADLK) {
mutex->deadlocks += 1;
}
}
void pthread_recursivemutex_unlock(pthread_recursivemutex_t *mutex)
{
if (mutex->deadlocks == 0) {
(void)pthread_mutex_unlock(&mutex->mutex);
} else {
mutex->deadlocks -= 1;
}
}
void pthread_recursivemutex_destroy(pthread_recursivemutex_t *mutex)
{
(void)pthread_mutex_destroy(&mutex->mutex);
}
我发现这种类型的递归互斥锁比具有PTHREAD_MUTEX_RECURSIVE
属性的互斥锁快很多:
iterations : 1000000
pthread_mutex_t : 71757 μSeconds
pthread_recursivemutex_t : 48583 μSeconds
测试代码(每次调用1000000次):
void mutex_test()
{
pthread_mutex_lock(&recursiveMutex);
pthread_mutex_lock(&recursiveMutex);
pthread_mutex_unlock(&recursiveMutex);
pthread_mutex_unlock(&recursiveMutex);
}
void recursivemutex_test()
{
pthread_recursivemutex_lock(&myMutex);
pthread_recursivemutex_lock(&myMutex);
pthread_recursivemutex_unlock(&myMutex);
pthread_recursivemutex_unlock(&myMutex);
}
pthread_recursivemutex_t
几乎是两倍的速度pthread_mutex_t
?!但两者的行为方式相同......?
顺便提一句:
pthread_mutex_t my_mutex;
void *m(void*a)
{
printf("m: %d %d\n", pthread_mutex_lock(&my_mutex), EDEADLK);
usleep(500 * 1000);
printf("m: %d\n", pthread_mutex_lock(&my_mutex));
pthread_mutex_unlock(&my_mutex);
return a;
}
void *m2(void *a)
{
printf("UNLOCKED!!: %d\n", pthread_mutex_lock(&my_mutex));
usleep(500 * 1000);
printf("m2: %d\n", pthread_mutex_lock(&my_mutex));
return a;
}
int main(int argc, const char * argv[])
{
pthread_t t,t2;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
pthread_mutex_init(&my_mutex, &attr);
pthread_create(&t, NULL, m, NULL);
pthread_create(&t2, NULL, m2, NULL);
pthread_join(t, NULL);
pthread_join(t2, NULL);
return 0;
}
给
m: 0 11
m: 11
UNLOCKED!!: 0
m2: 11
这意味着线程 2 在锁定时没有机会获得互斥锁。