为什么libcurl需要`CURLOPT_NOSIGNAL`选项以及启用它时的副作用是什么?

Vit*_*lii 9 c c++ multithreading curl libcurl

我花了很多时间来研究为什么多线程libcurl应用程序在Linux上崩溃.我在论坛中看到,我必须使用它CURLOPT_NOSIGNAL来绕过这个问题.好的,没有问题,但是有什么信息可以创造它的副作用吗?如果CURLOPT_NOSIGNAL = 0有错误,为什么libcurl现在都需要这个选项,甚至移动设备都有多核处理器,这就是为什么许多应用程序使用多个线程来使用这种硬件多任务支持?

del*_*eil 17

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

如果libcurl不是使用异步DNS支持(即线程解析程序或c-ares)构建的,则必须CURLOPT_NOSIGNAL在多线程应用程序中将该选项设置为1.

您可以在此处找到与此主题相关的更多详细信息:

为什么libcurl现在都需要这个选项呢?

主要是出于遗留原因,但也因为并非所有应用程序都在多线程上下文中使用libcurl.

这仍然是积极讨论的问题.见最近的讨论:

libcurl没有自己需要保护的线程,它不知道你使用什么线程库/概念,所以它不能自己设置回调.这一直是以前讨论的主题,确实有理由重新考虑我们能做什么和应该做什么,但这就是事情从那以后永远存在的方式.[...]但我总是愿意接受进一步的讨论!