6

我的(主要是 POSIX)应用程序的 Mac 版本生成了一个子线程,该线程调用 CFRunLoopRun() 来执行事件循环(从 MacOS 获取网络配置更改事件)。

到了收拾东西离开的时候,主线程在子线程的run-loop上调用CFRunLoopStop(),此时CFRunLoopRun()在子线程中返回,子线程退出,主线程(即阻塞等待子线程退出)可以继续。

这似乎可行,但我的问题是:这是一种安全/推荐的方法吗?特别是,从另一个线程调用 CFRunLoopStop() 是否容易导致竞争条件?据我所知,Apple 的文档对此主题保持沉默。

如果从主线程调用 CFRunLoopStop() 不是解决方案,那么什么是好的解决方案?我知道我可以让子线程调用 CFRunLoopRunInMode() 并经常唤醒以检查布尔值或其他内容,但如果可以避免的话,我不希望子线程进行任何轮询。

4

2 回答 2

15

在 CFRunLoopStop 的情况下 - 如果它只能在当前运行循环上安全地调用,那么就没有必要向它传递一个参数来指示要停止哪个运行循环。

该参数的存在强烈表明可以使用它来停止当前运行循环以外的运行循环。

于 2010-09-22T08:29:11.890 回答
4

特别是,是否从另一个线程调用 CFRunLoopStop() [安全]?

这是运行循环管理所说的:

Core Foundation 中的函数通常是线程安全的,可以从任何线程调用。

所以也许 CFRunLoopStop 是安全的。但我确实担心他们使用“一般”这个词。我的规则是:如果 Apple 不说它是安全的,你应该假设它不是。

为了安全起见,您可能会考虑创建一个运行循环源,将其添加到您的运行循环中,并在该结束线程时向该源发出信号。同一份文档包括一个自定义运行循环源的示例。

于 2009-09-02T01:14:23.843 回答