SDL_GetMouseState
函数线程是否安全?
在SDL_GetMouseState
的示例中,使用了已知为线程不安全的SDL_PumpEvents
。如果SDL_GetMouseState
是线程安全的,我是否必须使用线程不安全的SDL_PumpEvents
才能使其正常工作?
答案 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)。