0

问题:操作系统没有在两个线程之间执行循环,系统只是挂起。

我们的系统在 c++ 中实现为 HTTP 本机代码模块,用于 IIS/W2008 R2 64 位。设想:

  • 请求 1 到达 Web 服务器;IIS 启动了一个新线程 (t1)。线程正在执行。

  • 请求 2 在请求 1 完成之前到达。IIS 启动一个新线程 (t2)。该线程进入一个循环等待共享资源可用。这种行为是我们的程序。由于线程二 (t2) 进入循环,它开始消耗 100% 的 CPU。

问题:操作系统没有在两个线程之间执行循环,系统只是挂起。如果它将执行切换到第一个线程,则共享资源将被释放并且第二个线程也可以运行。

更奇怪的是:这种行为只在机器作为 1 个 CPU 时才会发生。如果我们向机器添加另一个 CPU,它会完美运行,在两个线程之间切换会按预期进行。什么都挂着。

在只有 1 个 CPU 时使其工作的一种解决方法(以及更好的编程)是在检查共享资源的可用性时将“sleep(100)”放入循环中。

当只有 1 个 CPU 时,为什么操作系统不在两个线程之间执行循环?它与VMWare有关吗?

4

1 回答 1

1

该线程进入循环等待共享资源可用

这听起来像是同步事物的错误方式,您需要在线程之间进行信号传递,以便操作系统获得执行上下文切换的提示。

于 2013-01-15T09:23:06.950 回答