【问题标题】:Need to understand one usage of pthread_mutex_lock() and pthread_cond_wait() and pthread_cond_signal()需要了解 pthread_mutex_lock() 和 pthread_cond_wait() 和 pthread_cond_signal() 的一种用法
【发布时间】: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


【解决方案1】:

在非多线程程序中使用这些函数有两个原因:

  • 函数是从通用代码调用的,可能在一个库中,并且这个库需要执行同步,以防进程是多线程的(库作者不知道)。如果没有同步,库可能无法在多线程程序中按预期工作。

  • 使用process-shared mutexesprocess-shared condition variables 跨进程而不是线程进行同步。

【讨论】:

  • 感谢您的回复,但我无法理解一点,那就是如果库被加载到进程的地址范围,创建线程然后从进程地址空间中取消引用.在这种情况下会是什么情况?
  • 对不起,我不明白。你能详细说明一下吗?如果库本身创建线程,那么应该有一个对pthread_create 的(间接)调用,所以我不认为这将是一个使用互斥锁而不是多线程的库的示例。
  • 感谢你们所有的宝贵见解,消除了我的疑虑。
猜你喜欢
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 2010-11-16
相关资源
最近更新 更多