SDL和C ++:等待多个线程完成

时间:2014-08-30 07:50:41

标签: c++ multithreading sdl

我无法修复以下问题: 我有10个线程不需要彼此交互,因此可以同时运行。 我在循环中创建它们。 但是我需要等到所有线程都完成,直到我可以继续使用for循环后启动的代码。 这是伪代码中的问题:

//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 ++的平台解决方案,我也可以。

2 个答案:

答案 0 :(得分: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 libary命令运行这个程序,它运行正常。然后我用SDL Calls替换了posix库调用。我没有SDL库,因此您可能需要编译一次代码。 希望这会有所帮助。

答案 1 :(得分:1)

你可以实现一个Semaphor,它为每个正在运行的线程递增,如果线程完成,它会减少Semaphor,你的主程序会等到它为0.

有很多例子可以实现信号量,并且它将与平台无关。