从另一个线程调用CFRunLoopStop是否安全?

Jer*_*ner 6 c c++ multithreading macos-carbon cfrunloop

我的(主要是POSIX)应用程序的Mac构建产生一个子线程,它调用CFRunLoopRun()来执行事件循环(从MacOS获取网络配置更改事件).

当打包并离开时,主线程在子线程的运行循环上调用CFRunLoopStop(),此时CFRunLoopRun()在子线程中返回,子线程退出,主线程(这是阻止等待子线程退出)可以继续.

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

如果从主线程调用CFRunLoopStop()不是解决方案,那么什么是好的解决方案?我知道我可以让子线程调用CFRunLoopRunInMode()并经常唤醒以检查布尔值或其他东西,但我宁愿不让子线程做任何轮询,如果我可以避免它.

Chr*_*cke 13

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

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


Pet*_*sey 5

\n

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

\n
\n\n

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

\n\n
\n

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

\n
\n\n

所以也许 CFRunLoopStop 是安全的。但我确实担心他们通常使用\xe2\x80\x9c 这个词\xe2\x80\x9d。我的规则是:如果苹果不说它是安全的,你就应该假设它不安全。

\n\n

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

\n