繁体   English   中英

非重叠串行 - 来自不同线程的 ReadFile() 调用是否相互阻塞?

[英]Non-Overlapped Serial - Do ReadFile() calls from separate threads block each other?

我继承了一个大型代码库,其中包含多个用于各种硬件组件的串行接口类。 这些串行模型中的每一个都使用非重叠串行进行通信。 我遇到一个问题,我的 CPU 随机峰值达到 100%,这导致线程暂时停止,然后 CPU 在大约 10-20 秒后恢复正常使用。

我的理论是,由于非重叠串行的阻塞性质,有时多个线程调用 readFile() 并相互阻塞。

我的问题是,如果多个线程同时调用readFile() (或writeFile() ),它们会互相阻塞吗? 根据我的研究,我相信这是真的,但想要确认。

该平台是运行 C++03 的 Windows XP,所以我没有很多可用的现代工具

“如果多个线程同时调用 readFile()(或 writeFile()),它们会互相阻塞吗?”

就我而言,他们会互相阻止。

我建议你可以参考 Doc: Synchronization and Overlapped Input 和 Output

当一个function被同步执行时,直到操作完成它才返回。 这意味着调用线程的执行可以在等待耗时操作完成时无限期地阻塞。 为重叠操作调用的函数可以立即返回,即使操作尚未完成。 这使得耗时的 I/O 操作可以在后台执行,而调用线程可以自由执行其他任务。

在多个线程上使用相同的事件可能会导致竞争条件,在这种情况下,对于操作首先完成的线程,事件被正确地发出信号,而对于使用该事件的其他线程,则它会过早地发出信号。

操作系统负责CPU。 您的代码只有在操作系统调用它时才会运行。 操作系统不会打扰运行被阻塞的线程。阻塞不会占用 CPU。 我建议您可以尝试使用Windows Performance Toolkik来检查 cpu 利用率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM