1

我有一个捕获控制器输入的线程。这是该线程唯一要做的事情——它XInputGetState()每 x 毫秒调用一次,并将结果存储在同步的循环缓冲区中。XInputSetState()我有另一个线程通过在达到特定条件时振动控制器来对此输入做出反应。

换句话说,一个线程只调用过XInputGetState(),而另一个线程只调用过XInputSetState()。从理论上讲,不可能同时多次调用任一函数。在没有同步的情况下这样做仍然不安全吗?

注意:这两个函数适用于完全不同的数据集,但实现很可能读取/写入不同步的内容。

4

2 回答 2

2

在这种情况下是的,因为 XInput API 对每个外部入口点调用都采用临界区锁定。

顺便说一句,当您使用 XInput 时,请查看这篇博文。仅使用这两个 API,您就可以使用内置于 Windows Vista 和更高版本操作系统的 XInput 9.1.0,它的标头位于 Windows 8.x SDK 中,它避免了与旧版 DirectSetup 混淆的任何需要部署 XInput 1.3。当然,如果您使用的是 Windows Store 应用程序,则只需使用 XInput 1.4,它是 Windows 8.x 操作系统的一部分,并且标头位于 Windows 8.x SDK 中。您需要使用旧版 DirectX SDK 的唯一情况是在 Windows 7 或更早版本上获得音频捕获/播放支持。

于 2014-07-25T23:21:29.267 回答
0

......并将结果存储在同步循环缓冲区中。我有另一个线程通过......对此输入做出反应”直接与您的其他陈述相矛盾:“不可能同时调用任何一个函数”因为操作系统不保证您的线程将在被推回等待状态之前完成它正在执行的任何操作。

换句话说:理论上(在实践中也是如此!)您的读取线程可能正在将数据推送到您的共享缓冲区中,并被调度程序换出,而写入线程计划在共享缓冲区位于中间正在更新

一般来说,一旦您对共享资源(在您的情况下 - “同步循环缓冲区”)拥有多个独立访问权限,您最好做正确的事情:)

如果在您的场景中,您仍然决定采用不安全的解决方案,您最终可能会遇到那些几乎无法调试的令人讨厌的每月一次的奇怪错误。

于 2014-07-25T23:04:29.693 回答