Ist es in Ordnung, std :: this_thread * -Funktionen von boost :: threads zu verwenden?

8

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.

    
Claudiu 17.04.2015, 21:52
quelle

2 Antworten

1

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 ¹

geraten

Natü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 ...)

    
sehe 18.04.2015, 09:21
quelle
1

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.

    
gavinb 18.04.2015 04:21
quelle

Tags und Links