【发布时间】:2018-03-02 21:13:59
【问题描述】:
我阅读了APUE 3rd,11.6.1 Mutexes,本章中有一个关于锁定和解锁互斥锁的示例:
struct foo {
int f_count;
pthread_mutex_t f_lock;
int f_id;
/* ... more stuff here ... */
};
struct foo *
foo_alloc(int id) /* allocate the object */
{
struct foo *fp;
if ((fp = malloc(sizeof(struct foo))) != NULL) {
fp->f_count = 1;
fp->f_id = id;
if (pthread_mutex_init(&fp->f_lock, NULL) != 0) {
free(fp);
return(NULL);
}
/* ... continue initialization ... */
}
return(fp);
}
void
foo_hold(struct foo *fp) /* add a reference to the object */
{
pthread_mutex_lock(&fp->f_lock);
fp->f_count++;
pthread_mutex_unlock(&fp->f_lock);
}
void
foo_rele(struct foo *fp) /* release a reference to the object */
{
pthread_mutex_lock(&fp->f_lock);
if (--fp->f_count == 0) { /* last reference */
pthread_mutex_unlock(&fp->f_lock);
pthread_mutex_destroy(&fp->f_lock);
free(fp);
} else {
pthread_mutex_unlock(&fp->f_lock);
}
}
在foo_rele中,pthread_mutex_unlock和pthread_mutex_destroy之间存在竞争条件:B线程可以在A线程的pthread_mutex_unlock和pthread_mutex_destroy之间调用pthread_mutex_lock 这将导致未定义的行为(“尝试销毁锁定的互斥体会导致未定义的行为”)。
我说的对吗?如果我是对的,那么如何使其正常工作或如何使用pthread_mutex_destroy 在 Linux 中安全正确地销毁互斥锁?
【问题讨论】:
标签: c linux pthreads mutex race-condition