2012-07-09 12 views
8

W informacjach o wydaniu wersji 1.50.0 bibliotek Google Boost Zauważyłam dwie łamanie zmian (see here):Przełamując zmiany Boost.Thread 3.0.0

# 6266 niszczące zmiana: gwint destruktor powinien zadzwonić zakończyć jeśli można dołączyć.

# 6269 Zmiana zerwania: przypisanie przeniesienia wątku powinno być zakończone, jeśli można je dołączyć.

Co to oznacza dla moich istniejących projektów obecnie korzystających z Boost 1.49.0? Czy muszę coś zmienić? Jeśli tak, co muszę dokładnie zmienić? A co się stanie, jeśli zapomnę zmodyfikować jeden z moich istniejących projektów? Czy otrzymam błędy czasu kompilacji (mam taką nadzieję), czy też pojawią się nieprzyjemne i trudne do znalezienia problemy z uruchomieniem (absolutnie nie mam takiej nadziei)?

Odpowiedz

7

Kiedy mówi "Przełamywanie zmian", oznacza to: "Twój program jest zepsuty, jeśli polegasz na zachowaniu, które poprzednio było X, ale teraz jest Y".

Dla podanych dwóch zmian, oznacza to, że jeśli polegać na destructor lub przenieść przypisanie wywołującego join() (lub detach()), który moim zdaniem był poprzednie zachowanie, program musi teraz wyraźnie join() lub detach() lub spotkać znajomego std::terminate() . Nie jest to błąd podczas kompilacji, ale nie jest też nieprzewidywalnym zachowaniem w czasie wykonywania - dostaniesz ładną czystą awaria prowadzącą od razu do destruktora boost::thread, co jest przyczyną problemu.

+1

Zauważ, że nazywa go rozwiązać jeśli zostanie dołączone, to znaczy, że nie zakończy się, jeśli obiekt wątku nie był wcześniej dołączony, ale został odłączony. – PlasmaHH

+1

Tak, zapomniałem o "odłączeniu()". – Puppy

7

następujący kod pracował prawidłowo, ale z v3 program zostanie przerwany jako t pozostawia jej zakres, ponieważ thread::~thread rozmowy std::terminate, zamiast dyskretnie odłączania od wątku:

#include <boost/thread.hpp> 
#include <iostream> 

void f() 
{} 

int main() 
{ 
    { 
    boost::thread t(f); 
    } 
    std::cout << "exiting gracefully" << std::endl; 
} 
Powiązane problemy