Linux 中的线程同步?
Thread synchronization in Linux?
我正在编写代码,其中让我的线程等待我执行 pthread_cond_broadcast。我在这段代码中有三个线程。线程 line2_thread 和 line3_thread 按优先级顺序排列 运行,就像它们应该 运行 一样。然而,我的第三个线程甚至没有进入它的线程函数(line4_thread)。谁能告诉我为什么我的 main() 不能调用我的 line4_thread ?
pthread_cond_t开始;
pthread_mutex_t sstart_mutex;
void *l3_thread(void *arg){
pthread_mutex_lock(&sstart_mutex);
pthread_cond_wait(&sstart, &sstart_mutex);
pthread_mutex_unlock(&sstart_mutex);
/*do something*/
pthread_exit(NULL);
}
void *l2_thread(void *arg){
pthread_mutex_lock(&sstart_mutex);
pthread_cond_wait(&sstart, &sstart_mutex);
pthread_mutex_unlock(&sstart_mutex);
/*do something*/
pthread_exit(NULL);
}
void *l4_thread(void *arg){
pthread_mutex_lock(&sstart_mutex);
pthread_cond_wait(&sstart, &sstart_mutex);
pthread_mutex_unlock(&sstart_mutex);
/*do something*/
pthread_exit(NULL);
}
int main(){
pthread_cond_init(&sstart, NULL);
//thread creation
pthread_cond_broadcast(&sstart);
pthread_cond_destroy(&sstart);
pthread_mutex_destroy(&sstart_mutex);
return 0;
}
我认为您在这里遇到了一些问题。抱歉(我在 phone 上,所以很难输入很长的答案)我只想专注于几件事,因为我不是 100% 清楚你到底想做什么。
当您的所有线程启动时,它们都会尝试获取互斥锁,但只有一个成功。可能是 l3,但我认为这里不能保证。然后它调用 pthread_cond_wait
并解锁互斥锁,允许其他线程之一到达它的 pthread_cond_wait
。但与此同时。您已经允许您的主线程调用 pthread_cond_broadcast
,并且您没有采取任何步骤将其与其他线程同步。它可能发生在其他人解除阻塞等待互斥量之前,以及他们的 wait
调用之前,因此他们可能会错过信号并永远阻塞。
此外,我认为立即调用pthread_cond_destroy
有点粗略。就像我说的,你的主线程和你的工作线程之间没有同步,所以你可以调用 pthread_cond_broadcast
然后调用 pthread_cond_destroy
,所以你的一些线程可能会调用 pthread_cond_wait
条件变量和死锁。
检查 pthread_cond_wait
的 return 个值。如果我是对的,在某些情况下可能 return EINVAL
。但是我还没有对此进行测试,因此我的推理可能存在缺陷。
我正在编写代码,其中让我的线程等待我执行 pthread_cond_broadcast。我在这段代码中有三个线程。线程 line2_thread 和 line3_thread 按优先级顺序排列 运行,就像它们应该 运行 一样。然而,我的第三个线程甚至没有进入它的线程函数(line4_thread)。谁能告诉我为什么我的 main() 不能调用我的 line4_thread ? pthread_cond_t开始; pthread_mutex_t sstart_mutex;
void *l3_thread(void *arg){
pthread_mutex_lock(&sstart_mutex);
pthread_cond_wait(&sstart, &sstart_mutex);
pthread_mutex_unlock(&sstart_mutex);
/*do something*/
pthread_exit(NULL);
}
void *l2_thread(void *arg){
pthread_mutex_lock(&sstart_mutex);
pthread_cond_wait(&sstart, &sstart_mutex);
pthread_mutex_unlock(&sstart_mutex);
/*do something*/
pthread_exit(NULL);
}
void *l4_thread(void *arg){
pthread_mutex_lock(&sstart_mutex);
pthread_cond_wait(&sstart, &sstart_mutex);
pthread_mutex_unlock(&sstart_mutex);
/*do something*/
pthread_exit(NULL);
}
int main(){
pthread_cond_init(&sstart, NULL);
//thread creation
pthread_cond_broadcast(&sstart);
pthread_cond_destroy(&sstart);
pthread_mutex_destroy(&sstart_mutex);
return 0;
}
我认为您在这里遇到了一些问题。抱歉(我在 phone 上,所以很难输入很长的答案)我只想专注于几件事,因为我不是 100% 清楚你到底想做什么。
当您的所有线程启动时,它们都会尝试获取互斥锁,但只有一个成功。可能是 l3,但我认为这里不能保证。然后它调用 pthread_cond_wait
并解锁互斥锁,允许其他线程之一到达它的 pthread_cond_wait
。但与此同时。您已经允许您的主线程调用 pthread_cond_broadcast
,并且您没有采取任何步骤将其与其他线程同步。它可能发生在其他人解除阻塞等待互斥量之前,以及他们的 wait
调用之前,因此他们可能会错过信号并永远阻塞。
此外,我认为立即调用pthread_cond_destroy
有点粗略。就像我说的,你的主线程和你的工作线程之间没有同步,所以你可以调用 pthread_cond_broadcast
然后调用 pthread_cond_destroy
,所以你的一些线程可能会调用 pthread_cond_wait
条件变量和死锁。
检查 pthread_cond_wait
的 return 个值。如果我是对的,在某些情况下可能 return EINVAL
。但是我还没有对此进行测试,因此我的推理可能存在缺陷。