【发布时间】:2008-12-30 18:29:54
【问题描述】:
我正在考虑在将同时处于活动状态的两个线程中对 QueryPerformanceCounter 进行重复调用(旋转)。我不确定这是否真的是一个问题,因为我没有看到任何关于它的文章,但是 QueryPerformanceCounter 线程安全吗?
谢谢
【问题讨论】:
标签: windows multithreading performancecounter
我正在考虑在将同时处于活动状态的两个线程中对 QueryPerformanceCounter 进行重复调用(旋转)。我不确定这是否真的是一个问题,因为我没有看到任何关于它的文章,但是 QueryPerformanceCounter 线程安全吗?
谢谢
【问题讨论】:
标签: windows multithreading performancecounter
这取决于您对 QueryPerformanceCounter 的参数所在的位置。如果它是两个线程之间的共享变量,那么听起来该函数不是线程安全的。
因此,我建议每个线程都有自己的LARGE_INTEGER 以传递给您对 QPC 的调用。每个调用都相互独立,应该适当地更新各自的LARGE_INTEGERs。
如果您处于多处理器环境中,此函数上的 MSDN article 还会提示 setting an affinity mask。
【讨论】:
我正在考虑重复 调用(旋转)到 QueryPerformanceCounter 在两个线程中 将同时处于活动状态。
哎呀。想想你在做什么以及有多少处理器可用。如果您有一个处理器,这将不起作用:它们不能“同时处于活动状态”,因为 QueryPerformanceCounter 不会将控制权从一个线程交给另一个线程。我相当确定单处理器的 win32 中的线程切换具有大约 1 毫秒的时间粒度。
如果您有多个处理器,则可能会得到错误的结果(理论上——我没有多处理器 PC,所以我自己没有观察到这一点)。更多关于 QPC 的有趣讨论可以在互联网上找到(例如,参见 Raymond Chen's 博客)
如果您真的想通过旋转等待来优化时间,我建议您在有此类专家的游戏编程论坛之一上询问最佳方法。
【讨论】: