# SDL_WaitConditionTimeout

Wait until a condition variable is signaled or a certain time has passed.

## Header File

Defined in [<SDL3/SDL_mutex.h>](https://github.com/libsdl-org/SDL/blob/main/include/SDL3/SDL_mutex.h)

## Syntax

```c
bool SDL_WaitConditionTimeout(SDL_Condition *cond,
                    SDL_Mutex *mutex, Sint32 timeoutMS);
```

## Function Parameters

|                                  |               |                                                                        |
| -------------------------------- | ------------- | ---------------------------------------------------------------------- |
| [SDL_Condition](SDL_Condition) * | **cond**      | the condition variable to wait on.                                     |
| [SDL_Mutex](SDL_Mutex) *         | **mutex**     | the mutex used to coordinate thread access.                            |
| [Sint32](Sint32)                 | **timeoutMS** | the maximum time to wait, in milliseconds, or -1 to wait indefinitely. |

## Return Value

(bool) Returns true if the condition variable is signaled, false if the
condition is not signaled in the allotted time.

## Remarks

This function unlocks the specified `mutex` and waits for another thread to
call [SDL_SignalCondition](SDL_SignalCondition)() or
[SDL_BroadcastCondition](SDL_BroadcastCondition)() on the condition
variable `cond`, or for the specified time to elapse. Once the condition
variable is signaled or the time elapsed, the mutex is re-locked and the
function returns.

The mutex must be locked before calling this function. Locking the mutex
recursively (more than once) is not supported and leads to undefined
behavior.

## Thread Safety

It is safe to call this function from any thread.

## Version

This function is available since SDL 3.2.0.

## Code Examples

```c
bool condition = false;
SDL_Mutex *lock;
SDL_Condition *cond;
lock = SDL_CreateMutex();
cond = SDL_CreateCondition();

Thread_A:
    const Uint32 timeout = 1000; /* wake up every second */
    bool done = false;
    while (!done) {
        SDL_LockMutex(lock);
        while (!condition && SDL_WaitConditionTimeout(cond, lock, timeout) == 0) {
            continue;
        }
        SDL_UnlockMutex(lock);
        if (condition) {
            /* ... */
        }
        /* ... do some periodic work */
    }
Thread_B:
    SDL_LockMutex(lock);
    /* ... */
    condition = true;
    /* ... */
    SDL_SignalCondition(cond);
    SDL_UnlockMutex(lock);

SDL_DestroyCondition(cond);
SDL_DestroyMutex(lock);

```

## See Also

- [SDL_BroadcastCondition](SDL_BroadcastCondition)
- [SDL_SignalCondition](SDL_SignalCondition)
- [SDL_WaitCondition](SDL_WaitCondition)

----
[CategoryAPI](CategoryAPI), [CategoryAPIFunction](CategoryAPIFunction), [CategoryMutex](CategoryMutex)

