服务应用程序的参考 Microsoft 代码不是线程安全的?

Reference Microsoft code of service application is not thread-safe?

我正在开发一个 windows 应 运行 作为服务的应用程序,我为此使用了此出版物:

https://msdn.microsoft.com/en-us/library/windows/desktop/bb540475(v=vs.85).aspx

但这不是线程不安全的吗?如果我理解正确,ReportSvcStatus(使用全局变量 gSvcStatus 和 gSvcStatusHandler)是从 SvcInit 和 SvcCtrlHandler 调用的,运行s 在不同的线程中。但是它不需要任何锁... 那么为什么使用这段代码是安全的呢?

代码接近线程安全,因为主线程和回调线程使用全局变量的时间不同——主线程在服务启动时,回调线程只一旦服务 运行,当服务关闭时再次进入主线程。

但是,在处理停止请求期间从回调线程第二次调用 ReportSvcStatus 可能会与发出停止事件信号后在主线程中调用 ReportSvcStatus 发生冲突。实际上,主线程不太可能对事件做出足够快的响应,这会成为一个问题;我不确定。我也不确定第二次通话的目的是什么;它似乎是多余的。删除它应该可以消除竞争条件。

我认为如果在调用 SetServiceStatus returns 之前将服务状态设置为 运行 后立即收到停止请求,也存在潜在的竞争条件,尽管这在实践中更不可能发生。这可以通过使用临界区保护 ReportSvcStatus 的内容来消除。

可能还存在一些多核(内存缓存)问题 - 这些问题更难以推理。我相信在 ReportSvcStatus 中使用关键部分也可以解决这些问题,至少在现有的 CPU 平台上是这样。