Ist es in Ordnung, Dinge aus boost::thread
und std::thread
zu mischen und anzupassen, oder sollte eine Gruppe von Funktionen für jede verwendet werden?
Ich frage, weil mein Code boost::thread
s verwendet, aber ich habe festgestellt, dass sich boost::this_thread::sleep_for
nicht korrekt verhält, wenn die Systemzeit zurückgesetzt wird, aber std::this_thread::sleep_for
, also würde ich gerne meinen Schlaf ändern function call und vermeide es, alle meine boost::thread
s auf std::thread
s zu ändern, wenn möglich.
In der Praxis könnten Sie mit Dingen davonkommen, wenn / weil die Implementierungen dieselben Implementierungen verwenden (z. B. pthread
auf Linux).
Sie werden jedoch Invarianten brechen. Einfaches Beispiel: Die Unterbrechungspunkte des Boost-Threads funktionieren nicht mit Nicht-Boost-Synchronisationsprimitiven (einschließlich std::this_thread::sleep_*
).
Deshalb habe ich gegen tatsächliche Bibliotheken zum Steuern verwandter Threads gerungen, damit Sie nicht in Überraschungen ¹
geratenNatürlich, wenn Bibliotheken völlig getrennte Interessen haben (z. B. verwenden sie intern Threads, "in der Blackbox"), sollte es kein Problem geben, diese Bibliotheken in einem Prozess zu kombinieren.
¹ Ich kann sehen, dass Deadlocks passieren, und Datenrennen / -lecks erfordern keine große Vorstellungskraft (denken Sie an lokale Thread-Datenunterstützung / call_once / set_value_at_thread_exit
...)
Es ist nicht ratsam, APIs in einem Thread zu mischen. Wie @Jerry Coffin erwähnt, kann es zu einem undefinierten Verhalten kommen. Möglicherweise gibt es einen lokalen Thread-Status, auf den diese APIs angewiesen sind und der nicht mit Threads kompatibel ist, die von einer anderen API erstellt wurden.
Es sollte jedoch in Ordnung sein, std::thread
und boost::thread
separat innerhalb des einen Prozesses zu verwenden. Da @Red Alert sagt, dass 1.58 den Fehler behebt, sollte dies Ihr Problem lösen. Andernfalls können Sie vorübergehend für verschiedene Plattformen mit usleep()
und ähnlichen Funktionen mit #ifdef
s zurückkehren.
Tags und Links c++ multithreading c++11 boost std