2014-12-20 89 views
0

當你下面的代碼:基本的多線程在C++(的執行順序)

#include <iostream> 
#include <cstdlib> 
#include <pthread.h> 

using namespace std; 

#define NUM_THREADS  5 

void *PrintHello(void *threadid) 
{ 
    long tid; 
    tid = (long)threadid; 
    cout << "Hello World! Thread ID, " << tid << endl; 
    pthread_exit(NULL); 
} 

int main() 
{ 
    pthread_t threads[NUM_THREADS]; 
    int rc; 
    int i; 
    for(i=0; i < NUM_THREADS; i++){ 
     cout << "main() : creating thread, " << i << endl; 
     rc = pthread_create(&threads[i], NULL, 
          PrintHello, (void *)i); 
     if (rc){ 
     cout << "Error:unable to create thread," << rc << endl; 
     exit(-1); 
     } 
    } 
    pthread_exit(NULL); 
} 

the out put will be 
main() : creating thread, 0 
main() : creating thread, 1 
main() : creating thread, 2 
main() : creating thread, 3 
main() : creating thread, 4 
Hello World! Thread ID, 0 
Hello World! Thread ID, 1 
Hello World! Thread ID, 2 
Hello World! Thread ID, 3 
Hello World! Thread ID, 4 

我很奇怪,爲什麼它不是

main() : creating thread, 0 
Hello World! Thread ID, 0 
main() : creating thread, 1 
Hello World! Thread ID, 1 
.... 

爲什麼我們創建線程,它會立即執行?

另一個問題線程0,1,2,3,4是否可能這些線程以隨機順序執行?例如,輸出將是

Hello World! Thread ID, 1 
Hello World! Thread ID, 4 
Hello World! Thread ID, 0 
Hello World! Thread ID, 2 
Hello World! Thread ID, 3 

非常感謝您的回答!

+0

我的意思是當我們創建線程pthread_create(&threads [i],NULL, PrintHello,(void *)i);爲什麼不立即執行,那麼在我們創建第二個線程之前它會給出輸出 –

+4

線程是異步執行的,所以它取決於操作系統的調度程序來決定運行它們的順序。您不能指望它們在任何特定訂購。 –

+0

除非你使用同步。但是,沒有它,不要考慮任何執行順序。 – Desaroll

回答

1

線程化系統的要點是它允許動作並行運行。最終意味着你有許多任務需要同時完成,而且你不關心完成這些任務的相關順序。

如果您想要按照一個順序發生任務,那麼問問自己線程的重點是什麼以及您想要從中獲得什麼。如果你有4個線程,但是在任何給定的時刻,只有其中一個線程正在執行,而其他線程正在等待他們的行動,那麼你可能會讓你的程序在一個線程中執行。

線程的操作假定排序無關緊要。操作系統爲您提供的保證是,除禁止任何同步原語外,操作系統將爲每個線程(通過調度)提供足夠的時間,以便根據應執行的任何操作取得進展。

pthread_create這樣的調用告訴操作系統產生一個將執行某些事情的新線程。你無法控制:

  1. 當操作系統將產生線程,或
  2. 線後產生了,此時操作系統會給它一個時間片執行足夠的指令來獲取到打印聲明。
+0

謝謝你,明白了! –