SDL2:SDL_GetMouseState()线程安全吗?

时间:2016-01-25 22:20:37

标签: sdl-2

SDL_GetMouseState函数线程是否安全?

SDL_GetMouseState的示例中,使用了已知为线程不安全的SDL_PumpEvents。如果SDL_GetMouseState是线程安全的,我是否必须使用线程不安全的SDL_PumpEvents才能使其正常工作?

1 个答案:

答案 0 :(得分:1)

此功能的代码是:

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;
}

SDL_GetMouse只返回静态全局变量的地址。因此,没有任何不安全因素,但没有原子性。

但是事件是单独处理的。如果您没有执行事件,则鼠标结构将不会更新,SDL_GetMouseState将为您提供过期值。文档明确声明您应该仅在图形线程(初始化图形系统的线程)中调用SDL_PumpEvents

最糟糕的情况是你从SDL_GetMouseState读取vales,而其他线程更新它。你可以读取旧值,新值,甚至是两个的混合(例如x来自new,但y来自old)。