2013-01-03 12 views

Odpowiedz

16

Tak! Zmienne globalne, przechwycone i przekazane są nadal dostępne po wywołaniu detach().

Jednakże, jeśli wywołujesz odłączenie, prawdopodobnie powrócisz z funkcji, która utworzyła wątek, pozwalając obiektowi gwintu wyjść poza zakres. W takim przypadku należy zadbać o to, aby żaden z lokali tej funkcji nie był przekazywany do wątku przez odwołanie lub wskaźnik.

Możesz myśleć o detach() jako deklaracji, że wątek nie potrzebuje niczego lokalnego do wątku tworzenia.

W poniższym przykładzie wątek nadal uzyskuje dostęp do int na stosie wątku początkowego po tym, jak zniknął poza zasięgiem. To jest niezdefiniowane zachowanie!

void start_thread() 
{ 
    int someInt = 5; 
    std::thread t([&]() { 
     while (true) 
     { 
      // Will print someInt (5) repeatedly until we return. Then, 
      // undefined behavior! 
      std::cout << someInt << std::endl; 
     } 
    }); 

    t.detach(); 
} 

Oto kilka możliwych sposobów, aby zachować dywan przed przetoczyła spod Twojego wątku:

  • stwierdzenie int gdzieś, że nie wyjdzie z zakresu czasie trwania jakichkolwiek wątków, które wymagają to (być może globalne).
  • Zgłaszanie udostępnionych danych jako std::shared_ptr i przekazywanie ich według wartości do wątku.
  • Przeprowadź podanie przez wartość (wykonanie kopii) do wątku.
  • Przeprowadź przez wątek referencję rvalue (wykonując ruch).
5

Tak. Odłączanie nici oznacza, że ​​po zakończeniu czyszczenia samo się oczyszcza i nie ma już potrzeby, ani nie jest to dozwolone.