我无法修复以下问题: 我有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 ++的平台解决方案,我也可以。
答案 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.
有很多例子可以实现信号量,并且它将与平台无关。