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。但是我还没有对此进行测试,因此我的推理可能存在缺陷。