2014-02-19 2 views
8

Ich verbrachte viel Zeit zu untersuchen, warum Multithreaded libcurl Anwendung unter Linux abstürzt. Ich habe in Foren gesehen, dass ich CURLOPT_NOSIGNAL verwenden muss, um dieses Problem zu umgehen. Ok, keine Probleme, aber gibt es irgendwelche Informationen, welche Nebenwirkungen kann es erzeugen? Wenn CURLOPT_NOSIGNAL = 0 fehlerhaft ist, warum benötigt libcurl diese Option überhaupt, wenn sogar mobile Geräte Multicore-Prozessoren haben, und deshalb verwenden viele Anwendungen mehrere Threads, um diese Hardware-Multitasking-Unterstützung zu nutzen?Warum libcurl `CURLOPT_NOSIGNAL`-Option benötigt und was sind die Nebenwirkungen, wenn es aktiviert ist?

Antwort

14

Standardmäßig verwendet die DNS-Auflösung Signale zur Implementierung der Timeout-Logik, aber dies ist nicht Thread-sicher: Das Signal könnte auf einem anderen Thread als dem ursprünglichen Thread ausgeführt werden, der es gestartet hat.

Wenn libcurl nicht mit async DNS-Unterstützung (was Threaded Resolver oder c-ares bedeutet) erstellt werden, müssen Sie die Option CURLOPT_NOSIGNAL in Ihrer Multithread-Anwendung auf 1 setzen.

können Sie weitere Details zu diesem Thema hier im Zusammenhang finden: an allen heutzutage

Warum Libcurl Bedürfnisse diese Option?

Hauptsächlich aus Legacy-Gründen, aber auch, weil nicht alle Anwendungen libcurl in einem Multithread-Kontext verwenden.

Dies ist immer noch etwas, das aktiv diskutiert wird. Sehen Sie diese recent discussion:

Libcurl hat keine Threads auf sein eigenes, dass sie schützen muss und es nicht weiß, was Thread-Bibliothek/Konzept, das Sie so es verwenden kann nicht auf seinen eigenen Satz die Rückrufe. Dies war das Thema für die Diskussion vor und es gibt in der Tat gültige Gründe zu überdenken, was wir tun können und sollten, aber das ist, wie Dinge seit seit immer und immer noch sind. [...] aber ich bin immer offen für weitere Diskussionen!

Verwandte Themen