SDL2: Je SDL_GetMouseState () thread-safe?

hlasů
34

Je SDL_GetMouseStatefunkce vlákno v bezpečí?

A v příkladu SDL_GetMouseStateje SDL_PumpEvents, o kterém je známo, že je nit-nebezpečné, je použit. Pokud SDL_GetMouseStateje thread-safe, musím použít SDL_PumpEvents, což je thread-bezpečný s tím, aby to funguje správně?

Položena 25/01/2016 v 20:20
uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Kód této funkce je:

Uint32
SDL_GetMouseState(int *x, int *y)
{
    SDL_Mouse *mouse = SDL_GetMouse();

    if (x) {
        *x = mouse->x;
    }
    if (y) {
        *y = mouse->y;
    }
    return mouse->buttonstate;
}

A SDL_GetMouseprávě vrátí adresu statické globální proměnné. Z toho důvodu není nic nebezpečné s ním, ale není tam žádný atomicity.

Události však jsou zpracovávány odděleně. Pokud nemáte prcess události, struktura myš nebude aktualizovat a SDL_GetMouseStatedá vám zastaralé hodnoty. Dokumentace výslovně uvádí, měli byste zavolat SDL_PumpEventspouze v grafickém závitu (ten, který inicializované grafický systém).

Nejhorším případě je to čteš Valeš z SDL_GetMouseStatezatímco druhá nit ji aktualizuje. Dalo by se číst starou hodnotu, novou hodnotu, nebo dokonce kombinace obou (např x od nové, ale y z starý).

Odpovězeno 26/01/2016 v 02:18
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more