我已经在多线程文件归档器上工作了一个星期,它仅在干净线程上工作。通过监视器和AutoResetEvent实现同步。 我将线程数分配给了这样的核心数:
public static int GetCoreCount()
{
int coreCount = 0;
foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
{
coreCount += int.Parse(item["NumberOfCores"].ToString());
}
return coreCount;
}
但是,这会使我的CPU最大负载达到65%。 而且这种负载远非均匀,它不断地上下波动。 告诉我。有谁知道如何使用100%处理器功能? 这是我的Run()代码:
public void Run()
{
var readingThread = new Thread(new ThreadStart(ReadInFile));
var compressingThreads = new List<Thread>();
for (var i = 0; i < CoreManager.GetCoreCount(); i++)
{
var j = i;
ProcessEvents[j] = new AutoResetEvent(false);
compressingThreads.Add(new Thread(() => Process(j)));
}
var writingThread = new Thread(new ThreadStart(WriteOutFile));
readingThread.Start();
foreach (var compressThread in compressingThreads)
{
compressThread.Start();
}
writingThread.Start();
WaitHandle.WaitAll(ProcessEvents);
OutputDictionary.SetCompleted();
writingThread.Join();
答案 0 :(得分:0)
在不进行概要分析的情况下,不可能说出是什么限制了您的核心使用,也无法知道您在测试中压缩了多少数据。
但是我可以说,为了获得良好的效率,其中包括完整的内核利用率和一个线程上 n 个线程的 n 加速因子,在pigz中,我必须创建始终在运行或等待更多工作的线程池。为每个要处理的数据块创建和销毁线程将产生巨大的影响。出于相同的原因,我也有预分配的内存块池。
链接中C语言中的源代码可能会有所帮助。