2014-08-30 225 views
0

我無法解決以下問題: 我有10個線程不需要彼此交互,因此都可以同時運行。 我在循環中創建它們。 但是,我需要等到所有線程都完成後,才能繼續執行for循環之後的代碼。 這裏是僞代碼的問題:SDL和C++:等待多線程完成

//start threads 
for (until 10) { 
    SDL_Thread* thread = SDL_CreateThread(); 
} 
//the rest of the code starts here, all threads need to be done first 

什麼是完成這件事的最佳方式?

我需要保持與該問題無關的平臺,這就是爲什麼我只嘗試使用SDL函數。

如果還有另一個獨立於C++的平臺解決方案,那我也很好。

+0

如果你可以使用'C++ 11',你可以在'C++ 11'中查看線程支持:http://en.cppreference.com/w/cpp/thread – olevegard 2014-08-30 07:53:13

回答

2
You can take the following approach: 

const int THREAD_COUNT = 10; 
static int ThreadFunction(void *ptr); 
{ 
    // Some useful work done by thread 
    // Here it will sleep for 5 seconds and then exit 
    sleep (5); 
    return 0; 
} 

int main() 
{ 
    vector<SDL_Thread*> threadIdVector; 

    // create 'n' threads 
    for (int count = 0; count < THREAD_COUNT; count++) 
    { 
     SDL_Thread *thread; 
     stringstream ss; 
     ss << "Thread::" << count; 
     string tname = ss.str(); 
     thread = SDL_CreateThread(ThreadFunction, tname, (void *)NULL); 
     if (NULL != thread) 
     { 
      threadIdVector.push_back (thread); 
     } 
    } 

    // iterate through the vector and wait for each thread 
    int tcount = 0; 
    vector<SDL_Thread*>::iterator iter; 
    for (iter = threadIdVector.begin(); 
       iter != threadIdVector.end(); iter++) 
    { 
     int threadReturnValue; 
     cout << "Main waiting for Thread : " << tcount++ << endl; 

     SDL_WaitThread(*iter, &threadReturnValue); 
    } 

    cout << "All Thread have finished execution. Main will proceed...." << endl; 

    return 0; 
} 

我用標準的POSIX庫文件命令運行這個程序,它工作正常。然後,我用SDL呼叫替換了posix庫調用。我沒有SDL庫,因此您可能需要編譯一次代碼。 希望這有助於。

+0

也許我錯了,但是,如果第一個線程在最後一個線程啓動之前完成,那麼迭代時是否會錯過某些線程?否則我真的很喜歡這種方法,因爲它很簡單。 – 2014-08-30 13:28:10

+0

@Marius這不會是一個問題。當主創建一個新線程時,它總是將其添加到向量中。因此,即使第一個線程在最後一個線程啓動之前完成,兩個線程指針都將被插入向量中。所以在迭代開始之前,矢量的大小保證爲10。現在在迭代期間,如果第一個線程已經完成執行,等待調用將立即返回,主線程現在將等待下一個線程。所以main只會等待那個仍在執行的線程,而其他線程會立即返回,這是我們想要的。 – vchandra 2014-08-30 20:36:04

1

您可以實現Semaphor這增加了每個正在運行的線程,如果線程完成它遞減Semaphor和你的主要PROGRAMM等待,直至爲0。

有很多例子旗語是如何實現的,並通過它將獨立於平臺。