我正在读史蒂文斯的书:apue。2e。我遇到了一个关于互斥锁的问题。
先来看一段代码:(以下代码来自apue 2e的图11.10)
#include <stdlib.h>
#include <pthread.h>
struct foo {
int f_count;
pthread_mutex_t f_lock;
/* ... more stuff here ... */
};
struct foo *
foo_alloc(void) /* allocate the object */
{
struct foo *fp;
if((fp = malloc(sizeof(struct foo))) != NULL){
fp->f_count = 1;
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); /* step 1 */
pthread_mutex_destroy(&fp->f_lock); /* step 2 */
free(fp);
}else{
pthread_mutex_unlock(&fp->f_lock);
}
}
假设我们有两个线程:thread1 和 thread2。thread1 正在运行。
它调用函数 foo_rele 并完成了第 1 步的执行(见上文),并准备执行第 2 步。
但是,此时会发生上下文切换。并且thread2开始执行。
thread2 锁定锁 fp->f_lock 然后做一些事情。但在thread2解锁之前,上下文切换再次发生。
thread2 停止执行,thread1 开始执行。thread1 销毁锁,我们知道所有错误生成。
所以,我的问题是:上面提到的情况有可能发生吗?我们如何避免它,是否有任何接口(API)可以原子地解锁和销毁互斥锁?