2011-09-26 51 views
37

縱觀在C++ 11的新的線程的東西,看它如何輕鬆地映射到並行線程,我注意到在thread構造區域好奇的部分:在C++ 11中,「不代表執行線程」的線程有什麼意義?

線程();
效果:構造一個不代表執行線程的線程對象。
後續條件: get_id()== id()
拋出: Nothing。

換句話說,一個線程默認的構造函數實際上並不似乎創建一個線程。很顯然,它創建了一個線程對象,,但是如果沒有後備代碼,它到底有用嗎?有沒有其他方式可以將「執行線程」附加到該對象上,如thrd.start()或類似的東西?

+0

C++ 11嚇唬你和我都在這一點上,幸運的是,我現在是一個內核開發,所以標準不再改變我:) –

+5

我認爲他們的意思是線程構造函數不創建實際的線程,它不調用操作系統,不分配堆棧/其他資源,通常不會創建停止的線程。我認爲這是到位的,所以人們會知道,在啓動它之前創建線程並不會浪費任何東西(除了某些標誌存儲)。 – Dani

+5

@Jesus Ramos:內核開發者害怕標準改變?如果我正確地記得每個新處理器都會在內核中發生某些事情,或者添加一個需要大量重寫才能實現的功能。 – Dani

回答

34

有沒有其他方法可以將「執行線程」附加到該對象,如thrd.start()或類似的東西?

// deferred start 
std::thread thread; 

// ... 

// let's start now 
thread = std::thread(functor, arg0, arg1); 

std::thread是MoveConstructible和MoveAssignable類型。所以這意味着在像std::thread zombie(some_functor); std::thread steal(std::move(zombie));zombie這樣的代碼中將會留下一個與沒有執行線程相關的特殊但有效的狀態。默認構造函數在某種意義上是免費的,因爲它所要做的就是將對象置於精確狀態。它還允許std::threadstd::vector<std::thread>::resize等操作。

+0

實際上......你的線程的線程ID爲0.沒有內部本地線程上下文。它只是數組和stl容器的佔位符類型。 – Noishe

3

只是猜測,但它只是意味着線程未啓動。換句話說,它只是一個像其他任何對象一樣的對象 - 它並不一定是一個真正的操作系統線程。換句話說,如果線程是在pthread之上實現的,創建一個C++ 11線程對象並不一定會調用pthread_create() - 只有當線程啓動時才需要這個線程。

+0

所以,我的查詢將成爲我問題的第二部分:「你怎麼開始它? – paxdiablo

+0

也許你不能。畢竟,如果你使用了零參數構造函數,你還沒有爲* do *指定任何線程。不過,我想,這會導致您爲什麼可以創建這樣一個無用的對象的問題。 – davmac

+0

相反:正如Luc Danton在他的回答中指出的那樣,您可以使用賦值操作符來啓動線程。 – davmac

18

這意味着同樣的事情,因爲這:

std::vector<int> emptyList; 

emptyList是空的。就像默認構建的std::thread一樣。就像默認構建的std::ofstream不會打開文件一樣。有完全合理的理由讓類缺省構造成空狀態。


如果你有一個空螺紋:

std::thread myThread; 

實際上,你可以通過這樣啓動線程:

myThread = std::thread(f, ...); 

哪裏f是一些可調用的東西(函數指針,仿函數, std::function等)和...是要轉發給線程的參數。

8

不只是猜測:

「線程對象」 是指std::thread

「執行線程」是指OS's collection of hardware registers that represent a thread

C++ 11除了在操作系統的API上訪問操作系統線程外,沒有做任何事情,爲的是讓C++線程跨所有操作系統移植。

thread();
效果:構造一個不代表執行線程的線程對象。
後續條件: get_id()== id()
拋出: Nothing。

這意味着默認構造的std::thread不引用OS產生的執行線程。

一個std::thread可以賦予了新的價值,並由此開始通過此舉賦值語句指執行的操作系統線程:

std::thread t; // Does not refer to an OS thread 
//... 
t = std::thread(my_func); // t refers to the OS thread executing my_func