gpt4 book ai didi

pthreads - 需要互斥锁来保护条件变量

转载 作者:行者123 更新时间:2023-12-01 08:35:53 25 4
gpt4 key购买 nike

据说需要 Mutex 来保护条件变量。

这里是否引用了声明为pthread_cond_t
的实际条件变量或者
一个普通的共享变量count,它的值决定了信号和等待。
?

最佳答案

is the reference here to the actual condition variable declared as pthread_cond_t or a normal shared variable count whose values decide the signaling and wait?

对两者的引用。

互斥体可以检查共享变量(您的问题中的 count),如果该变量的值不满足所需条件,则执行等待pthread_cond_wait() 内部将针对该检查自动发生。

互斥锁解决的问题是您有两个需要原子的独立操作:

  1. 检查count的条件
  2. 如果条件尚未满足,则在 pthread_cond_wait() 内等待。

pthread_cond_signal() 不会“持续” - 如果没有线程在 pthread_cond_t 对象上等待,则信号什么也不做。因此,如果没有互斥体使上面列出的两个操作彼此原子化,您可能会发现自己处于以下情况:

  • 一旦 count 非零,线程 A 想要做某事
  • 线程 B 在增加 count 时会发出信号(这会将 count 设置为非零值)

    1. 线程“A”检查count并发现它为零
    2. 在“A”调用pthread_cond_wait()之前,线程“B”出现并将count增加到1并调用pthread_cond_signal()。该调用实际上没有任何影响,因为“A”还没有等待 pthread_cond_t 对象。
    3. “A”调用pthread_cond_wait(),但由于不记得条件变量信号,它会在此时阻塞,等待已经来过的信号。

互斥体(只要所有线程都遵循规则)使得第 2 项不会出现在第 1 项和第 3 项之间。线程“B”将有机会增加 count< 的唯一方法 要么在 A 查看 count 之前,要么在 "A"已经在等待信号之后。

关于pthreads - 需要互斥锁来保护条件变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10648204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com