2017-08-22 11 views
6

Lines od Anthony Williams książki:std :: posunięcie C++

Poniższy przykład ilustruje użycie std :: przenieść do przeniesienia własności dynamicznego obiektu w wątku:

void process_big_object(std::unique_ptr<big_object>); 

std::unique_ptr<big_object> p(new big_object); 
p->prepare_data(42); 
std::thread t(process_big_object,std::move(p)); 

określając std::move(p) w konstruktora std::thread, własność big_object jest przenoszony najpierw do wewnętrzny przechowywania na nowo utworzony wątek, a następnie w process_big_object.

Rozumiem stos i stertę; jakikolwiek pomysł, co tak naprawdę jest to ?

Dlaczego nie można przenieść ich własność bezpośrednio do process_big_object?

+3

każdy wątek ma swój własny stos. Obiekt wątku musi najpierw zażądać utworzenia własnego stosu i innych zasobów systemu operacyjnego, zanim będzie mógł wywołać twoją funkcję z własnym stosem jako bazą. Musi więc przechowywać dane gdzieś przed wysłaniem do swojej funkcji. – PeterT

+0

dzięki, @PeterT. który odpowiedział na ostatnią część moich pytań. –

Odpowiedz

11

Oznacza to, że obiekt będzie chwilowo należeć do obiektu std::thread aż gwint rzeczywiście zaczyna.

wewnętrznego magazynowania tutaj odnosi się do pamięci związanego z obiektem std::thread. Może to być zmienna składowa lub po prostu trzymana w stosie podczas konstruktora. Ponieważ jest to zależne od implementacji, używane jest ogólne i nieumoitalne pojęcie "pamięci wewnętrznej".

+0

Obie odpowiedzi równie dobre. Zaakceptowanie tego dla ostatniej linii. –

9

Wszystkie argumenty do wątku są kopiowane do jakiejś wewnętrznej pamięci utrzymywanego przez obiekt std::thread, więc to może być przekazane do funkcji wątku.

Że pamięć wewnętrzna jest własnością obiektu std::thread przed własność jest przekazywana do rzeczywistej funkcji wątku.

0

Dlaczego nie mogą przenieść własności bezpośrednio na process_big_object?

Ponieważ nie ma linii we fragmencie kodu, gdzie process_big_object nazywany jest jako funkcja. Ostatni wiersz fragmentu wywołuje konstruktor std::thread. Uruchomi łańcuch zdarzeń, które ostatecznie spowodują wywołanie process_big_object(p) w nowym wątku; ale to połączenie nie jest tutaj widoczne.