【问题标题】:Thread waiting for signal but never gets it, because of mutex lock由于互斥锁,线程等待信号但从未得到它
【发布时间】:2020-06-15 16:00:18
【问题描述】:

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

我在理解我的主线程如何锁定互斥锁时遇到问题,然后我的线程也会锁定它并等待信号。我的意思是这是每个人都给出的“指导方针”,但我不明白它是如何工作的。由于 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】:

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

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

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

    【讨论】:

    • 我知道它是如何工作的。我不明白的是:主锁互斥锁->创建线程->信号->解锁,但是当线程试图锁定互斥锁时,主还没有解锁它,所以它又怎么能等待它发出信号?
    • 这里的关键是:线程必须在主锁和互斥体信号之前等待。启动线程,并在循环中等待一个条件(例如,while(!condition) { pthread_cond_wait(...)})。然后在主锁定互斥锁,更改条件和信号。您设置测试代码的方式会误导您,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2010-12-07
    • 1970-01-01
    • 2017-07-10
    • 2020-01-10
    相关资源
    最近更新 更多