使用C+设置流程核心配额+; 如果你编写软件,客户支付软件使用的CPU核心数,那么在C++代码中,最好的方法是什么?到目前为止,我的研究使我在Windows上使用了SetProcessAffinityMask,在POSIX系统上使用了sched_setaffinity

使用C+设置流程核心配额+; 如果你编写软件,客户支付软件使用的CPU核心数,那么在C++代码中,最好的方法是什么?到目前为止,我的研究使我在Windows上使用了SetProcessAffinityMask,在POSIX系统上使用了sched_setaffinity,c++,multicore,core,C++,Multicore,Core,这是一个有趣的问题。我不认为我有完美的解决方案,但由于到目前为止还没有回应,让我提出以下建议: 如果程序中的主要工作是由一种类型的线程完成的,那么不要产生超过客户许可证允许的工作线程。由于单个线程不能划分为在多个内核上运行,这就造成了一个硬限制 (我不认为设置进程CPU亲和力是一种可行的方法,因为它可以在运行时轻松更改。因为它不需要对系统进行任何反向工程或永久性修改,所以我担心绕过这一点不会让诚实的客户感到“不好”,甚至会阻止他们尝试。)我想你找到了最好的选择。如果你想利用多线程处理器的功能,限

这是一个有趣的问题。我不认为我有完美的解决方案,但由于到目前为止还没有回应,让我提出以下建议:

如果程序中的主要工作是由一种类型的线程完成的,那么不要产生超过客户许可证允许的工作线程。由于单个线程不能划分为在多个内核上运行,这就造成了一个硬限制


(我不认为设置进程CPU亲和力是一种可行的方法,因为它可以在运行时轻松更改。因为它不需要对系统进行任何反向工程或永久性修改,所以我担心绕过这一点不会让诚实的客户感到“不好”,甚至会阻止他们尝试。)我想你找到了最好的选择。如果你想利用多线程处理器的功能,限制线程数量不是一个好主意。

对你的问题的正确详细回答:[1]:@hakiko这个问题是关于找出Windows上有多少个内核,您应该了解一下作业对象:它们在限制流程方面的作用远远大于关联性。但它们也会限制亲和力:这是你的软件还是他们的软件?你对机器有多大的控制权?您希望如何准确地建模您的度量指标:如果软件在大部分时间使用一个内核,但在10个周期内接触另一个内核,您会将其计算为使用两个内核吗?“客户为软件使用的CPU内核数量付费”-如何计算这些核心非常重要-如果您运行的线程数不超过允许的核心数,则在给定时间内不会使用更多的核心。一些操作系统会不时地将这些线程调度到所有可用的内核,所以如何计算线程数量取决于计算机所有者。上面提到的函数应该防止系统自由移动线程,这样就可以让您的问题得到解答。设置线程配额也可以这样做。当涉及到人们在运行时更改进程关联性时,我想我偶尔会使用
GetProcessAffinityMask
检查关联性,如果自我第一次在
main
中设置它以来发生了更改,就会抛出一个许可异常(退出)已经暗示您不想利用这些功能,除非客户付费。