【问题标题】:Disabling multi core programmatically以编程方式禁用多核
【发布时间】:2011-01-23 13:34:33
【问题描述】:

是否有任何可能的方法来禁用 Windows 上的多核功能并仅使用 C\C++ 使用单核?任何允许它的图书馆? 我的应用程序访问我们用于与主机通信的芯片模块之一。我们怀疑其他人正在访问此模块并对其进行更改。奇怪的是,它只发生在多核系统(Windows 7 64 位)上,当您将 Windows 设置为仅使用单核 (How to disable a core) 时,一切正常。

在我看来,Windows 不应允许任何程序以编程方式完成它,但我希望我弄错了。

编辑:我不是在寻找重新提升我的线程技能的建议。我的问题可能更多与硬件或固件相关(也许第二个核心也在访问我的芯片模块)。

第二次编辑:这不是软件问题!我只想知道是否可以使用 C\C++ 禁用多核。我不寻求线程建议,因为我 100% 确定问题不存在。

第三次编辑:问题已解决。问题在于我的客户运行的另一个进程访问了我的应用程序正在访问的同一共享内存。 正如我之前提到的,我的线程没有问题,我从来没有得到我想要的答案:关于天气的简单是或否,可以使用 C++ 禁用其中一个内核。 处理器亲和性在我的特殊情况下没有帮助。

【问题讨论】:

  • 听起来您的应用程序中可能存在与线程相关的错误,在单核上运行时根本不会表现出来(通常足够)。并不少见。
  • @CWAN:这不可能是线程相关的错误,因为只有一个线程访问我的芯片模块。

标签: c++ c window core multicore


【解决方案1】:

我认为一些解决方法可以是为一个核心设置任务的主线程的亲和性,而不是为其他核心创建具有无限循环的线程并将它们设置为尽可能高的优先级。但是,如果软件不能在多核硬件上运行,通常是软件出了问题。

【讨论】:

    【解决方案2】:

    多线程是一头野兽。即使是“万无一失”有时也会咬你……嗯……“背”。

    当您使用线程时,您应该正确使用,因为操作系统只需要遵循一些规则,并且可以随意安排您的线程。 IIRC,您可以设置优先级等,也许可以表达某些操作系统中某些 CPU 的偏好。

    即使您只使用一个额外的线程,您仍然有两个,因为主应用程序也会运行。

    也许可以看看专门用于线程调试的调试工具。也许他们可以帮助你。

    首先,我会添加一些访问模块的互斥锁或同步区域。

    【讨论】:

      【解决方案3】:

      如果您怀疑硬件驱动程序不是线程安全的,请使用以下设置中断关联。

      http://www.microsoft.com/whdc/system/sysperf/intpolicy.mspx

      【讨论】:

        【解决方案4】:

        即使在单核上,您也可以随时被打断。所以我怀疑你的问题是由于切换内核造成的。

        【讨论】:

          【解决方案5】:

          除非您的 C/C++ 库使用线程,否则我无法想象内核数量会如何影响运行时行为。如果您的应用确实使用线程,它们在一个内核和多个内核上的执行可能会有所不同,但如果您在多核系统上遇到错误,您可能会在单核系统上遇到相同的错误。

          您可以在启动应用程序时set processor affinity。这会将您的应用程序锁定到一个处理器。这可能是解决问题的简单方法。

          【讨论】:

          • 我的库确实使用线程,但只有一个线程访问这个模块。我的另一个线程无法访问此模块。
          • @Eldad:为了确定而尝试仍然是一件简单的事情。单个线程总是有可能与其他线程共享数据,然后在访问模块时最终使用损坏的数据。根据应用程序对模块的访问模式,您甚至可以尝试在应用程序已经运行时设置处理器关联(使用任务管理器)。
          猜你喜欢
          • 2017-12-08
          • 2011-08-11
          • 2010-10-15
          • 1970-01-01
          • 2017-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-10
          相关资源
          最近更新 更多