int SDL_SemWait(SDL_sem* sem)
sem | セマフォ |
#define NB_WAITER 10
SDL_sem *sem;
// 2秒ごとにセマフォを加算する
int poster_thread() {
for (int i = 0; i < NB_WAITER; i++) {
SDL_SemPost(sem);
SDL_Delay(2 * 1000);
}
return 0;
}
int waiter_thread() {
int status;
status = SDL_SemWait(sem);
if (status == 0) {
SDL_Log("セマフォを減算した¥n");
} else {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "待っている間にエラーが発生した: %s¥n", SDL_GetError());
}
return 0;
}
int main() {
sem = SDL_CreateSemaphore(0);
create_and_wait_threads(); // 加算スレッド1個, 減算スレッド10個
SDL_DestroySemaphore(sem);
}
セマフォsemの値が正になる, 割り込みが発生する, またはエラーが発生するまでこの関数を呼んだスレッドを停止する. 呼び出しが成功すれば, セマフォの値をアトミックに減算する.
この関数は, SDL_SemWaitTimeout()の待ち時間をSDL_MUTEX_MAXWAITとしたのと同じである.