void SDL_WaitThread(SDL_Thread* thread, int* status)
thread | SDL_CreateThread()で開始されたスレッドのSDL_Threadポインタ |
status | スレッド関数がreturnで戻した値を代入する整数の変数へのポインタ. NULLならば戻り値を受け取らない. 詳細を参照すること |
#include <stdio.h>
#include "SDL_thread.h"
#include "SDL_timer.h"
// とても簡単なスレッド - 50ms間隔で0から9までカウントする
int TestThread(void *ptr)
{
int cnt;
for (cnt = 0; cnt < 10; ++cnt) {
SDL_Log("¥nスレッドカウンタ: %d", cnt);
SDL_Delay(50);
}
return cnt;
}
int main(int argc, char *argv[])
{
SDL_Thread *thread;
SDL_threadID threadID;
int threadReturnValue;
SDL_Log("¥n簡単なSDL_CreateThreadのテスト:");
// 単にスレッドを生成する
thread = SDL_CreateThread(TestThread, "TestThread", (void *)NULL);
if (NULL == thread) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "¥nSDL_CreateThread 失敗: %s¥n", SDL_GetError());
exit(-1);
}
// 新しく開始されたスレッドのIDを得る
threadID = SDL_GetThreadID(thread);
// スレッドの完了を待ち戻り値を得る
SDL_WaitThread(thread, &threadReturnValue);
SDL_Log("¥nスレッドの戻り値: %d", threadReturnValue);
return 0;
}
スレッドの終了を待つ. デタッチされていないスレッドは, この関数で消滅するまで(「ゾンビ」のように)残る. これを行わないとリソースリークを引き起こす.
この関数でスレッドが消滅すると, そのSDL_Threadは使えなくなるので再び参照してはならない. 1つのスレッドの終了をSDL_WaitThread()で待つのは, 別の1つのスレッドのみにしたほうがよい.
スレッド関数の戻り値は, statusがNULLでなければ, statusの領域に書き込まれる.
デタッチされたスレッドに対してSDL_WaitThread()を呼んではならない. SDL_WaitThread()かSDL_DetachThread()のどちらかであり, 両方を使ってはならない. さもなくば, その動作は未定義のものになる.
引数をNULLとしても安全である. その場合は無視される.
threadポインタはこの関数で解放されるため, その後は使えないので注意すること.