下面的快速代码应该永远阻塞-- 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,同样的行为。
发布于 2017-10-23 15:13:37
pthread_cond_wait可以拥有假唤醒。POSIX对此非常明确:
在使用条件变量时,总是有一个包含与每个条件等待关联的共享变量的布尔谓词,如果线程继续执行,则为真。可能会发生来自pthread_cond_timedwait()或pthread_cond_wait()函数的虚假唤醒。由于来自pthread_cond_timedwait()或pthread_cond_wait()的返回并不意味着任何关于该谓词值的内容,因此在返回时应该重新计算谓词。
在您的环境中,在调试器下运行会导致这样的唤醒,可能是因为调试器触发了额外的信号。如果调试器以这种方式影响应用程序行为,肯定会很烦人,但从技术上讲,它并不是一个bug。
https://stackoverflow.com/questions/46892256
复制相似问题