从32位xp移动到64位Win7 - 线程影响

时间:2011-06-23 08:02:40

标签: multithreading windows-7 .net-4.0

今年我们正在推动操作系统和处理器架构。我们当前的应用程序并不是特别的线程安全,但它确实在当前的规格上运行良好。我们也转向.net4。

我们正在以适当的线程安全方式重写应用程序,但这是一个多年的项目,我们别无选择,但移动编码不佳的系统。

我的问题是:有没有人处于类似情况?在我们开始实施新规范之前,我们如何确保我们能够解决所有问题?有没有一种减轻这些线程风险的好方法?此外,在移动中我们应该警惕线程调度和行为的主要变化是什么? 提供任何帮助

2 个答案:

答案 0 :(得分:2)

我不知道操作系统或框架中的任何内容会从根本上改变现有应用程序中的线程调度。我预见到的最大风险是新CPU可能比现在运行得更快(更新通常等于更快),这将改变在给定进程的每个时间片中可以执行的代码量。如果一个线程遇到等待状态,则会有更多时间片可供其他线程运行。由于这种时序变化,任何现有的休眠线程错误都可能更常见。或者你可能会继续幸运。你没有提到这一点,但如果你是第一次转向多核硬件,你几乎肯定会在你的过程中看到更大的并发性(因此也就是碰撞的风险)。

对于缓解,除了检查共享数据/代码并正确保护可以同时访问的所有内容之外,确实没有好的补救措施。如果您在测试中遇到灾难性问题(您计划在部署之前运行完全压力和回归吗?),您可以考虑在线程或相关函数顶部进行某种“大锁定”,以确保风险代码无法交叉与同行的路径。这可能会降低性能,但是始终崩溃的高性能代码无论如何都没有多大用处。

答案 1 :(得分:2)

正如史蒂夫汤森所提到的,不应该有任何显着的差异,有几点需要注意:

  1. 从32位移动到64位可能会导致问题,因为指针会变大。这意味着您不能再使用DWORD值来保存指针。
  2. Vista和Win7是超线程感知。这意味着他们在调度不同逻辑核心上的任务时会更有效率。这可能意味着您会看到意外的上下文切换(正如Steve所写)可能会暴露应用程序中的现有并发问题。