|
Size: 1702
Comment: minor change
|
← Revision 9 as of 2013-08-12 05:40:21 ⇥
Size: 1634
Comment:
|
| Deletions are marked like this. | Additions are marked like this. |
| Line 2: | Line 2: |
| #pragma disable-camelcase ||<tablewidth="100%" style="color: #FF0000;" :> DRAFT|| |
#pragma camelcase off |
| Line 6: | Line 5: |
| Use this function to create a semaphore, initialized with ^a^ value,, returns NULL on failure,, *create a new semaphore and assign an initial value to it*. | Use this function to create a semaphore. |
| Line 16: | Line 15: |
| ||'''initial_value'''||^the starting value for the semaphore^|| | ||'''initial_value'''||the starting value of the semaphore|| |
| Line 19: | Line 18: |
| *<<BR>>Returns a pointer to an initialized semaphore or NULL if there was an error.<<BR>>* ; call [[SDL_GetError]]() for more information. |
Returns a new semaphore or NULL on failure; call [[SDL_GetError]]() for more information. |
| Line 24: | Line 21: |
| * | ## Begin Semaphore Example Typical use of semaphores: |
| Line 26: | Line 24: |
| SDL_sem *my_sem; | SDL_atomic_t done; SDL_sem *sem; |
| Line 28: | Line 27: |
| my_sem = SDL_CreateSemaphore(INITIAL_SEM_VALUE); | SDL_AtomicSet(&done, 0); sem = SDL_CreateSemaphore(0); . . Thread A: while (!SDL_AtomicGet(&done)) { add_data_to_queue(); SDL_SemPost(sem); } |
| Line 30: | Line 37: |
| if (my_sem == NULL) { return CREATE_SEM_FAILED; } |
Thread B: while (!SDL_AtomicGet(&done)) { SDL_SemWait(sem); if (data_available()) { get_data_from_queue(); } } . . SDL_AtomicSet(&done, 1); SDL_SemPost(sem); wait_for_threads(); SDL_DestroySemaphore(sem); |
| Line 34: | Line 51: |
| *<<BR>><<Color2(green,Should this example be expanded like the other Create functions and then Included on the SDL_!DestroySemaphore page?)>> | ## End Semaphore Example |
| Line 37: | Line 54: |
| *<<BR>>[[SDL_CreateSemaphore]]() creates a new semaphore and initializes it with the value '''initial_value'''. Each locking operation on the semaphore by [[SDL_SemWait]](), [[SDL_SemTryWait]]() or [[SDL_SemWaitTimeout]]() will atomically decrement the semaphore value. The locking operation will be blocked if the semaphore value is not positive (greater than zero). Each unlock operation by [[SDL_SemPost]]() will atomically increment the semaphore value. <<BR>>* | This function creates a new semaphore and initializes it with the value '''initial_value'''. Each wait operation on the semaphore will atomically decrement the semaphore value and potentially block if the semaphore value is 0. Each post operation will atomically increment the semaphore value and wake waiting threads and allow them to retry the wait operation. |
| Line 40: | Line 57: |
| .[[SDL_DestroySemaphore]] * .[[SDL_SemPost]] * .[[SDL_SemTryWait]] * .[[SDL_SemValue]] * .[[SDL_SemWait]] * .[[SDL_SemWaitTimeout]]* |
.[[SDL_DestroySemaphore]] .[[SDL_SemPost]] .[[SDL_SemTryWait]] .[[SDL_SemValue]] .[[SDL_SemWait]] .[[SDL_SemWaitTimeout]] |
SDL_CreateSemaphore
Use this function to create a semaphore.
Contents
Syntax
SDL_sem* SDL_CreateSemaphore(Uint32 initial_value)
Function Parameters
initial_value |
the starting value of the semaphore |
Return Value
Returns a new semaphore or NULL on failure; call SDL_GetError() for more information.
Code Examples
Typical use of semaphores:
SDL_atomic_t done;
SDL_sem *sem;
SDL_AtomicSet(&done, 0);
sem = SDL_CreateSemaphore(0);
.
.
Thread A:
while (!SDL_AtomicGet(&done)) {
add_data_to_queue();
SDL_SemPost(sem);
}
Thread B:
while (!SDL_AtomicGet(&done)) {
SDL_SemWait(sem);
if (data_available()) {
get_data_from_queue();
}
}
.
.
SDL_AtomicSet(&done, 1);
SDL_SemPost(sem);
wait_for_threads();
SDL_DestroySemaphore(sem);
Remarks
This function creates a new semaphore and initializes it with the value initial_value. Each wait operation on the semaphore will atomically decrement the semaphore value and potentially block if the semaphore value is 0. Each post operation will atomically increment the semaphore value and wake waiting threads and allow them to retry the wait operation.
