2014-02-19 1 views
8

Я потратил много времени, чтобы выяснить, почему многопоточное приложение libcurl врезается в Linux. Я видел на форумах, что я должен использовать CURLOPT_NOSIGNAL, чтобы обойти эту проблему. Хорошо, никаких проблем, но есть ли какая-либо информация о том, какие побочные эффекты могут создать? Если CURLOPT_NOSIGNAL = 0 ошибочно, почему libcurl вообще нуждается в этой опции, когда даже мобильные устройства имеют многоядерные процессоры, и поэтому многие приложения используют несколько потоков для использования этой аппаратной многозадачности?Почему libcurl нуждается в опции `CURLOPT_NOSIGNAL` и какие побочные эффекты включены?

ответ

14

По умолчанию разрешение DNS использует сигналы для реализации логики тайм-аута, но это небезопасно: сигнал может быть выполнен в другом потоке, чем исходный поток, который его запускал.

Когда libcurl не построен с поддержкой async DNS (это означает, что с помощью разрешающей способности с резьбой или c-ares), вы должны установить опцию CURLOPT_NOSIGNAL в 1 в многопоточном приложении.

Вы можете найти более подробную информацию по этой теме здесь:

Почему Libcurl нужен этот вариант вообще в наше время?

Главным образом по устаревшим причинам, но также и потому, что не все приложения используют libcurl в многопоточном контексте.

Это еще что-то, что активно обсуждается. Смотрите это recent discussion:

Libcurl не имеет резьбы на своем собственном, что она нуждается в защиту, и он не знает, что нить библиотеку/концепции вы используете поэтому он не может по своему собственному набору обратных вызовов. Это было предметом обсуждения до этого, и есть действительно действующие причины пересмотреть то, что мы можем и должны делать, но это то, как дела обстоят с тех пор, как навсегда и до сих пор. [...], но я всегда открыт для дальнейших обсуждений!