我有一个捕获控制器输入的线程。这是该线程唯一的作用 - 它每隔x毫秒调用XInputGetState()
并将结果存储在同步的循环缓冲区中。我有另一个线程,当达到某个条件时,通过XInputSetState()
振动控制器来响应此输入。
换句话说,一个线程只调用XInputGetState()
,而另一个线程只调用XInputSetState()
。从理论上讲,任何一个函数同时被多次调用都没有意义。没有同步这样做仍然不安全吗?
注意:这两个函数适用于完全不同的数据集,但实现很可能是对未同步的内容进行读/写。
答案 0 :(得分:2)
在这种情况下是的,因为XInput API会对每个外部入口点调用执行临界区锁定。
BTW,正如您使用XInput时,请查看this博文。只有这两个API,您可以使用内置于Windows Vista和更高版本操作系统的XInput 9.1.0,它的标题位于Windows 8.x SDK中,并且它可以避免任何混乱使用旧版DirectSet的麻烦部署XInput 1.3。当然,如果您使用的是Windows应用商店应用,那么您只需使用XInput 1.4,它是Windows 8.x操作系统的一部分,标头位于Windows 8.x SDK中。您需要使用旧版DirectX SDK的唯一情况是在Windows 7或更早版本上获得音频捕获/回放支持。
答案 1 :(得分:0)
“ ...并将结果存储在同步的循环缓冲区中。我有另一个线程通过... ”对此输入做出反应“直接与您的其他语句相矛盾:”可以无论何时同时调用任何一个函数“因为操作系统无法保证你的线程将完成处理它之前正在做什么被推回等待状态。
换句话说:理论上(实际上也是如此!)您的阅读线程可能正在将数据推入共享缓冲区并被调度程序和计划运行的写入线程交换出来共享缓冲区正在更新。
一般来说,一旦你有一个以上的独立访问共享资源(在你的情况下 - “一个同步的循环缓冲区”)你最好做正确的事情:)
如果在您的场景中,您仍然决定使用不安全的解决方案,那么您可能最终会遇到那些每月发生一次奇怪事情的麻烦,这些错误几乎无法调试。