SDL_Semaphore * SDL_CreateSemaphore(Uint32 initial_value);
| Uint32 | initial_value | セマフォの初期値 |
この関数は新しいセマフォを生成し, initial_valueの値で初期化する.
セマフォの待機操作でアトミック(不可分)にセマフォの値を1減算する. もしセマフォの値が0ならば待機する.
通知操作でアトミックにセマフォの値を1加算し, 待機中のスレッドを再開し, それらが再び待機操作をすることを許可する.
セマフォの典型的な使用法:
void add_data_to_queue(void);
void get_data_from_queue(void);
int data_available(void);
void wait_for_threads(void);
SDL_AtomicInt done;
SDL_Semaphore *sem;
SDL_SetAtomicInt(&done, 0);
sem = SDL_CreateSemaphore(0);
Thread_A:
while (!SDL_GetAtomicInt(&done)) {
add_data_to_queue();
SDL_SignalSemaphore(sem);
}
Thread_B:
while (!SDL_GetAtomicInt(&done)) {
SDL_WaitSemaphore(sem);
if (data_available()) {
get_data_from_queue();
}
}
SDL_SetAtomicInt(&done, 1);
SDL_SignalSemaphore(sem);
wait_for_threads();
SDL_DestroySemaphore(sem);