【问题标题】:What happens if a pthread condition variable is signaled but the mutex is locked?如果 pthread 条件变量发出信号但互斥锁被锁定,会发生什么?
【发布时间】:2014-05-08 22:00:27
【问题描述】:

考虑以下几点:

pthread_mutex_t m;
pthread_cond_t c;

//a bunch of passenger threads will all be doing this
pthread_mutex_lock(&m); //passengers join the queue for boarding one at a time
pthread_cond_wait(&c, &m); //joined queue, mutex now unlocked allowing other passengers to join queue
//wait for a ride thread to signal the variable (representing the queue), allowing passengers to board one at a time
//
//Do some work in here required for boarding the ride
//
pthread_mutex_unlock(&m); //allow the next passenger to do the work required to board

我能否保证一次只有一名乘客能够访问“在这里做一些工作”部分?据我了解,一旦条件变量发出信号,该线程将重新锁定互斥锁并继续。如果在一个线程收到信号并开始工作后,ride 线程再次向 cond 变量发出信号会发生什么?第二个线程会等待第一个线程解锁互斥锁,还是两个线程现在都在“在这里做一些工作”部分?

【问题讨论】:

    标签: c pthreads


    【解决方案1】:

    考虑是否使用 pthread_cond_broadcast 而不是 pthread_cond_signal。在条件上处于 pthread_cond_wait 中的所有线程都会发出唤醒信号。他们中只有一个可以,因为为了退出 pthread_cond_wait,他们每个人都必须重新获取互斥锁。获得互斥锁的那个完成并解锁互斥锁,然后下一个获得互斥锁。尽管唤醒的线程比需要的多会影响性能,但这不应更改正确使用 pthread_cond_wait 的代码的正确功能。

    来自 pthread_cond_wait 的手册页:

        "Spurious wakeups from the pthread_cond_timedwait() or pthread_cond_wait() functions may occur."
    

    当线程从 pthread_cond_wait 返回时,它应该检查是否有数据(受互斥锁保护)表明它实际上可以继续。通常,这涉及执行 pthread_cond_signal 的线程增加计数或设置标志(受互斥锁保护),以及接收 pthread_cond_wait 的线程在标志值为零时在等待调用上循环,如果它不为零,则减少在它离开其互斥保护部分之前标记。

    我没有看到预期的循环,也没有看到您提供的代码段中处理的信号值。

    【讨论】:

    • 也不要将此视为队列。没有指定当条件变量发出信号时将唤醒哪个线程(当然只有一个线程在等待)
    • 对不起,如果我的问题不是很清楚,这基本上是我想知道的。我不确定是否需要重新获取互斥锁才能退出到 pthread_cond_wait 或只是退出等待的效果。
    猜你喜欢
    • 1970-01-01
    • 2021-10-21
    • 2015-06-19
    • 1970-01-01
    • 2011-02-15
    • 2020-01-10
    • 1970-01-01
    相关资源
    最近更新 更多