2013-03-13 69 views
0

在C++中創建線程的最簡單方法是什麼?我想讓一個使用已經聲明的方法運行。喜歡的東西:C++非常簡單的線程?

void task1(){ 
    cout << "Thread started"; 
} 

thread t1 = thread(task1()); 

我猜我要讓不需要下載任何庫和我的編譯器將最有可能能夠編譯一個線程。我想回答的一個大問題是,什麼是C++ 11?它是一種完全不同的語言,還是一堆圖書館?

+3

使用什麼線程標準? [C++ 11](http://en.cppreference.com/w/cpp/thread)? POSIX? Win32的? – 2013-03-13 02:41:28

+6

你接近真實的東西:'std :: thread t1(task1)'; – GManNickG 2013-03-13 02:42:41

+0

@MJJavaCoffee「不需要下載任何庫,並且我的編譯器很可能能夠編譯。」你使用什麼編譯器? – OmnipotentEntity 2013-03-13 02:48:49

回答

7

C++ 11有線程庫。一個很簡單的例子是:

#include <iostream> 
#include <thread> 
void task1() 
{ 
    std::cout<<"Thread started\n"; 
} 
int main() 
{ 
    std::thread t1(task1); 
    t.join(); 
} 

http://en.cppreference.com/w/cpp/thread/thread

+6

而在C++ 03中,'boost :: thread'將提供非常相似的東西。 – 2013-03-13 02:46:27

+0

什麼是C++ 11,一個庫或一種編程語言? – 2013-03-13 02:58:00

+0

@MJJavaCoffee,它是C++的新標準。請參閱http://en.wikipedia.org/wiki/C%2B%2B11。 C++的創造者Bjarne Stroustrup說:「感覺像是一種新語言」。 – taocp 2013-03-13 02:59:33

2

如果您不能使用C++ 11,這取決於你所使用的編程什麼。下面的「越簡單越好」線程例子是寫在非託管的Win32代碼,使用CreateThread功能:

#include <Windows.h> 
#include <tchar.h> 
#include <iostream> 

using namespace std; 

DWORD WINAPI ThreadFunction(LPVOID lpParam) { 
    WORD numSeconds = 0; 
    for (;;) { 
     Sleep(1000); 
     cout << numSeconds++ << " seconds elapsed in child thread!" << endl; 
    } 
    return 0; 
} 

int _tmain(int argc, _TCHAR* argv[]) { 
    HANDLE hThread; 
    DWORD threadID; 
    WORD numSeconds = 0; 

    cout << "Hello world" << endl; 

    hThread = CreateThread(NULL, 0, ThreadFunction, NULL, 0, &threadID); 

    Sleep(500); 
    for (;;) { 
     cout << numSeconds++ << " seconds elapsed in main thread!" << endl; 
     Sleep(1000); 
    } 

    return 0; 
} 

如果你使用這種方法,請記住,傳遞給CreateThread的函數指針必須有簽名:

DWORD ThreadFuncion(LPVOID lpParameter); 

您可以在MSDN上找到該簽名的說明。

+0

小挑剔,雖然你在示例中包含它:函數指針的簽名也應包含該調用約定。 – chris 2013-03-13 03:07:56

+0

我的電腦無法編譯這個。幫幫我? – 2013-03-13 12:16:37

0

C++標準每隔幾年就經常修改一次。一些很酷的東西被添加並保留舊的東西以實現向後兼容。這裏有一些history

Boost對驅動C++標準有很好的影響。