我花了很多时间调查为什么多线程的libcurl应用在Linux上会崩溃。我在论坛上看到,我必须使用CURLOPT_NOSIGNAL
来解决这个问题。好的,没问题,但是有没有任何信息说明它可能会产生什么副作用?如果CURLOPT_NOSIGNAL = 0
存在漏洞,为什么现在连移动设备都有多核处理器,并且许多应用程序使用多线程来利用这种硬件多任务支持,libcurl仍需要此选项呢?
我花了很多时间调查为什么多线程的libcurl应用在Linux上会崩溃。我在论坛上看到,我必须使用CURLOPT_NOSIGNAL
来解决这个问题。好的,没问题,但是有没有任何信息说明它可能会产生什么副作用?如果CURLOPT_NOSIGNAL = 0
存在漏洞,为什么现在连移动设备都有多核处理器,并且许多应用程序使用多线程来利用这种硬件多任务支持,libcurl仍需要此选项呢?
默认情况下,DNS解析使用信号来实现超时逻辑,但这不是线程安全的:信号可能会在启动它的原始线程之外的另一个线程上执行。
当libcurl没有构建异步DNS支持(这意味着线程化解析器或c-ares)时,您必须在多线程应用程序中将CURLOPT_NOSIGNAL
选项设置为1。
你可以在这里找到更多关于这个主题的详细信息:
为什么现在libcurl仍然需要这个选项?
主要是由于遗留原因,但还因为不是所有应用程序都在多线程上下文中使用libcurl。
这仍然是一个正在积极讨论的问题。请参阅这个最近的讨论:
libcurl本身没有需要保护的线程,它也不知道您使用什么线程库/概念,因此不能自行设置回调。这已经是以前讨论的主题了,确实有重新考虑我们可以和应该做什么的有效原因,但这就是事情从来没有改变过的方式。[...]但我总是开放进一步的讨论!