为什么libcurl需要`CURLOPT_NOSIGNAL`选项,启用它会有哪些副作用?

14

我花了很多时间调查为什么多线程的libcurl应用在Linux上会崩溃。我在论坛上看到,我必须使用CURLOPT_NOSIGNAL来解决这个问题。好的,没问题,但是有没有任何信息说明它可能会产生什么副作用?如果CURLOPT_NOSIGNAL = 0存在漏洞,为什么现在连移动设备都有多核处理器,并且许多应用程序使用多线程来利用这种硬件多任务支持,libcurl仍需要此选项呢?

1个回答

22

默认情况下,DNS解析使用信号来实现超时逻辑,但这不是线程安全的:信号可能会在启动它的原始线程之外的另一个线程上执行。

当libcurl没有构建异步DNS支持(这意味着线程化解析器或c-ares)时,您必须在多线程应用程序中将CURLOPT_NOSIGNAL选项设置为1。

你可以在这里找到更多关于这个主题的详细信息:

为什么现在libcurl仍然需要这个选项?

主要是由于遗留原因,但还因为不是所有应用程序都在多线程上下文中使用libcurl。

这仍然是一个正在积极讨论的问题。请参阅这个最近的讨论

libcurl本身没有需要保护的线程,它也不知道您使用什么线程库/概念,因此不能自行设置回调。这已经是以前讨论的主题了,确实有重新考虑我们可以和应该做什么的有效原因,但这就是事情从来没有改变过的方式。[...]但我总是开放进一步的讨论!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接