所以我正在编写一个具有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
,以便等待线程可以唤醒。
在您的示例中,您已经在互斥锁已锁定的情况下创建了线程,因此线程没有机会传递第一个锁。这意味着当您向线程发出信号时,它没有在等待。