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

Swift 如果使用Xcode 9设置断点,为什么pthread_cond_wait返回?,swift,xcode,pthreads,Swift,Xcode,Pthreads,下面的swift代码应该永远阻塞-pthread_cond_wait永远不会返回,因为没有人发出信号。 当我运行它时,它会按预期阻塞。 如果我甚至使用Xcode 9.0.1设置了一个断点,那么执行将继续到printhi行。 这是一个奇怪的Xcode错误还是我做了一些完全错误的事情 import Foundation func check(_ ret:Int32){ if ret != 0 { fatalError("Error \(ret)") } } var

下面的swift代码应该永远阻塞-pthread_cond_wait永远不会返回,因为没有人发出信号。 当我运行它时,它会按预期阻塞。 如果我甚至使用Xcode 9.0.1设置了一个断点,那么执行将继续到printhi行。 这是一个奇怪的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对此非常明确:

使用条件变量时,如果线程应该继续,则始终存在一个布尔谓词,该谓词涉及与每个条件等待相关联的共享变量。可能会发生pthread_cond_timedwait或pthread_cond_wait函数的虚假唤醒。由于pthread_cond_timedwait或pthread_cond_wait的返回并不意味着与此谓词的值有关的任何内容,因此应在此类返回时重新计算谓词


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

谢谢!从未听说过这个,现在我知道我有一些可能会中断的旧代码:-注意,如果在进程运行时在Xcode中设置断点,lldb必须中断进程,因为我们必须插入一个陷阱来实现断点,并且在程序使用断点时写程序文本是不安全的。中断是将pthread_cond_wait弹出等待状态的原因之一。如果我们只为调试器SPT(其行为不像正常的中断机制)提供特殊中断,那就太好了,但是我们必须使用标准的系统方法来做这类事情,包括它们的副作用。