由于互斥锁,线程正在等待信号,但从未得到它

问题描述 投票:0回答:1

所以我正在编写一个具有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);
}
multithreading mutex condition-variable
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.