【发布时间】:2018-10-01 12:59:30
【问题描述】:
我需要了解pthread_mutex_lock() 和pthread_cond_wait() 和pthread_cond_signal() 的一种用法。
我看过一段代码,其中一个函数,例如,CallANumber() 从 main() 调用,在这个 CallANumber() 函数内部,pthread_mutex_lock() 与 pthread_cond_wait() 一起使用,然后由 @987654329 释放@ 并且还有另一个函数,例如WaitForResponse(),在这个函数内部pthread_mutex_lock() 和pthread_cond_signal() 已被pthread_mutex_unlock() 调用和释放。
但我在源代码库中没有找到任何pthread_create() 调用。
是否可以调用Pthread_mutex_lock/unlock() 和pthread_cond_wait/signal() API 而没有从未调用过pthread_create() 函数?
【问题讨论】:
-
最好是引用代码,然后(尝试)用散文描述。
-
如果没有其他线程发出条件信号,代码将挂在
pthread_cond_wait()。不过,代码可以通过某个库创建线程,而不是直接调用pthread_create() -
@nos:很有可能,在没有其他线程的退化情况下,谓词始终为真,因此
pthread_cond_wait不会在惯用循环中被调用。例如,while (wanted_resource_is_used_by_another_thread) pthread_cond_wait(&cnd, &mtx); -
@R.. 感谢您的回复,但请您详细说明您的这一陈述 - “在退化的情况下” - 我无法理解退化的情况是指或意味着什么。还有这个陈述 - “谓词总是正确的” - 这里指的是什么谓词?
-
@linard_in:使用条件变量的一般模式是等到某个谓词(例如“非空”或“非满”)在受互斥体保护的数据上为真。我所说的“退化”只是指只有一个线程,因此没有其他线程可以抗衡的情况。假设一个谓词本质上不依赖于其他线程的存在,那么在单线程情况下它应该始终为真。
标签: c linux-kernel embedded posix embedded-linux