2015-04-17 16 views
8

Czy można mieszać i łączyć elementy od boost::thread i std::thread, czy też powinien być używany jeden zestaw funkcji?Czy można używać funkcji std :: this_thread * z boost :: threads?

Pytam, ponieważ mój kod wykorzystuje boost::thread s, ale odkryłem, że boost::this_thread::sleep_for nie zachowuje się poprawnie podczas ustawiania czasu systemowego z powrotem, ale std::this_thread::sleep_for robi, więc chciałbym zmienić mój sen wywołanie funkcji i uniknąć zmiany wszystkie moje boost::thread s do std::thread s jeśli to możliwe.

+3

mieszając je będzie wyraźnie dać niezdefiniowany zachowanie. To może zadziałać, jeśli twoja standardowa biblioteka użyje kodu wystarczającego jak Boost, ale oceniłbym prawdopodobieństwo jako dość niskie (chociaż nie da się nawet zgadnąć, kiedy nie powiesz nam, jaki to kompilator/biblioteka, za pomocą). –

+0

Po prostu fyi, doładowanie 1.58 naprawia błąd snu, o którym mówisz (wydany dzisiaj) –

Odpowiedz

1

W praktyce możesz uciec od rzeczy iff /, ponieważ implementacje używają tych samych implementacji (np. pthread w systemie Linux).

Jednak będzie łamać niezmienniki. Prosty przykład: Zwiększone punkty przerwania wątku nie będą działać z prymitywami synchronizacji bez wspomagania (w tym std::this_thread::sleep_*).

Dlatego ja Avice przeciwko faktycznie mieszanie bibliotek do sterowania pokrewnych tematów, abyście nie chcą ryzykować z systemem do niespodzianek ¹

oczywiście, jeśli biblioteki mają całkowicie odrębne problemy (np wykorzystują wątki wewnętrznie " w czarnej skrzynce "), nie powinno być problemu łączącego te biblioteki w jednym procesie.


¹ widzę zakleszczenia dzieje i wyścigi danych/przecieki nie wymagają ogromny odcinek wyobraźni (myślę wątku lokalne wsparcie techniczne/call_once/set_value_at_thread_exit ...)

1

Niewłaściwe jest mieszanie interfejsów API w jednym wątku. Jak wspomina @Jerry Coffin, możesz popaść w niezdefiniowane zachowanie. Może istnieć stan lokalny wątku, na którym opierają się te interfejsy API, który nie byłby zgodny z wątkami utworzonymi przez inny interfejs API.

Należy jednak używać oddzielnie std::thread i boost::thread w ramach jednego procesu. Ponieważ @Red Alert twierdzi, że 1.58 naprawia błąd, powinno to rozwiązać twój problem. W przeciwnym razie możesz tymczasowo powrócić do usleep() i podobnych funkcji z #ifdef s dla różnych platform.

+0

Myślę, że 'usleep' nadal łamałby niezmienniki biblioteki; Plusem jest to, że czyni to jaśniejszym. Na przykład. niewielu ludzi spodziewa się, że punkty przerw w magicznej pracy z 'usleep' – sehe

Powiązane problemy