如果使用 Xcode 9 设置断点,为什么pthread_cond_wait返回



下面的 swift 代码应该永远阻塞 - pthread_cond_wait不应该返回,因为没有人发出信号。
当我运行它时 - 它按预期阻止。
如果我使用 Xcode 9 (9.0.1) 设置断点,则执行将继续执行到print("hi")行。
这是一个奇怪的Xcode错误还是我做错了什么?

import Foundation
func check(_ ret:Int32){
    if ret != 0 {
        fatalError("Error (ret)")
    }
}
var cond = pthread_cond_t()
pthread_cond_init(&cond,nil)
var mutex = pthread_mutex_t()
check(pthread_mutex_init(&mutex,nil))
check(pthread_mutex_lock(&mutex))
check(pthread_cond_wait(&cond,&mutex))
print("Hi")
check(pthread_mutex_unlock(&mutex))

也与pthread_cond_timedwait检查,相同的行为。

pthread_cond_wait可能会有虚假的唤醒。 POSIX对此非常明确:

使用条件变量

时,始终存在一个布尔谓词,涉及与每个条件等待关联的共享变量,如果线程应继续,则为 true。可能会发生来自 pthread_cond_timedwait() 或 pthread_cond_wait() 函数的虚假唤醒。由于来自 pthread_cond_timedwait() 或 pthread_cond_wait() 的返回并不意味着此谓词的值,因此应在此类返回时重新评估谓词。

似乎在您的环境中,在调试器下运行会导致此类唤醒发生,这可能是由于调试器触发的额外信号。 如果调试器以这种方式影响应用程序行为,这当然很烦人,但从技术上讲,这不是错误。

最新更新