线程等待信号,但由于互斥锁而从未收到信号



所以我正在制作一个带有 1 个主线程(我的主线程(的程序,它会创建第二个线程。第二个应该等待信号,然后运行。主要当然等待加入。

我在理解我的 main 如何锁定互斥锁时遇到问题,然后我的线程也会锁定它并等待信号。我的意思是,这是每个人都给出的关于如何做到这一点的"指南",但我看不出它是如何工作的。由于主锁互斥锁,那么线程将始终进入锁定静音并等待互斥锁解锁,不是吗?这样,信号将在线程获取互斥锁并在等待中阻塞之前发送(因此永远不会被唤醒(。但话又说回来,需要锁定互斥锁才能等待变量......请帮忙。 这是代码,它创建了一个循环,因为线程函数块在等待中。

static pthread_mutex_t mtx;
pthread_cond_t cond;
void *threadfunction(void* arg){
pthread_mutex_lock(&mtx);
pthread_cond_wait(&cond,&mtx);
pthread_mutex_unlock(&mtx);
}
int main(void){
pthread_mutex_init(&mtx,NULL);
pthread_cond_init(&cond,NULL);
pthread_t tthread;
pthread_mutex_lock(&mtx);
pthread_create(&tthread,NULL,threadfunction,NULL);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mtx);
pthread_join(tthread,NULL);
}

您可能在pthread_cond_wait中遗漏的一个细节是它在开始等待时释放互斥锁。

条件变量的场景是,当线程需要等待条件发生时,它会锁定互斥锁并调用wait。这将释放互斥锁,以便其他线程可以进入其关键部分、更改条件和signal以便等待线程可以唤醒。

在您的示例中,您在互斥锁已锁定时创建线程,因此线程没有机会传递第一个锁。这意味着当您发出信号时,它没有等待。

最新更新