我有一个计划,我会喜欢上运行的一个CPU所以它不会占用太多的系统资源。问题是,它使得一个叫成一个外部DLL自动地使用所有可用的CPU核心。我没有的源代码的外部DLL。我怎么可以限制DLL只使用一个CPU?

编辑:谢谢你的帮助,这里是代码,我在使用限制为一个CPU(Windows):

// Limit the process to only 1 thread so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
DWORD ProcessAffinityMask;
DWORD SystemAffinityMask;
if(GetProcessAffinityMask(ProcessHandle,&ProcessAffinityMask,&SystemAffinityMask)
    && SystemAffinityMask != 0)
{
    // Limit to 1 thread by masking all but 1 bit of the system affinity mask
    DWORD NewProcessAffinityMask = ((SystemAffinityMask-1) ^ SystemAffinityMask) & SystemAffinityMask;
    SetProcessAffinityMask(ProcessHandle,NewProcessAffinityMask);
}

编辑:事实证明布兰农的做法设置过程中的优先工作,甚至更好的是什么我想,这是保持该进程从嚼资源。在这里的代码(Windows):

// Make the process low priority so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
SetPriorityClass(ProcessHandle,BELOW_NORMAL_PRIORITY_CLASS);
有帮助吗?

解决方案

设置处理器亲和力是错误的做法。让OS手柄调度。

如果机器闲置,要使用尽可能多的处理器,你可以。否则,你正在做无故少的工作。如果机器忙,那么你要使用的“自由”的循环,而不是其他进程产生不利影响。

Windows有这个功能内置。此适当的解决方案是设置进程的基本优先级。

请参阅 http://msdn.microsoft.com /en-us/library/ms686219(VS.85).aspx 以上SetPriorityClass()的信息。

如果你要测试的这款无需编写任何代码,使用任务管理器来更改进程的优先级。

其他提示

您可以设置你的程序的CPU亲和力。尝试在Windows上 SetProcessAffinityMask 功能或的在Linux了sched_setaffinity

一般情况下,一个DLL住在同一线程/内存空间调用它的代码。调用DLL本身不应该创建线程的行为。如果在调用该DLL似乎创建更多的线程,这意味着,DLL本身某处它的代码创建的线程。如果你没有为DLL任何源代码或文档,没有什么可以做这件事(如果你想的DLL来完成其工作,有没有什么你应该做这个)。

您可以尝试用你的应用程序的优先级玩 - 将其设置为低可能会改变CPU使用率,即使它不改变被创造了什么的线程。但它很可能是你真正想要的是让文档此兽。如果不知道代码是如何工作的,一般情况下,没有太多可以做,以改变它的工作原理。没有超级天才可以改变这种状况。

呃......为什么?说真的,你为什么要限制一个库,是能够给你以这样的方式额外的性能?你们是不是要访问共享资源的东西?有人会认为,一个多线程库将能够安全地处理这一点。

除非有你没有提的东西,我不能看到甚至尝试,以限制多线程库到单个线程的任何正当理由。

所以你的程序中使用一个线程,但你不想要的外部DLL使用多于一个线?你没有太多的控制的外部DLL,但某些做法可能是:

您并没有说这是什么平台。我要在这里假设窗口。

创建子进程,并将其与工作联系起来对象。然后,您可以设置处理器亲和力为作业对象只包括可用的CPU内核之一。子进程是不能够改变的亲和力口罩,任何不是针对作业对象的处理器亲和力的一个子集。另外,你应该记住不要设置的限制JOB_OBJECT_LIMIT_BREAKAWAY_OK或工作,否则子进程将能够摆脱工作的扩展限制JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK

此外,可以设置用于作业的优先级和调度类。也许这将是足够的以较低的CPU和/或IO优先级来创建子进程?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top