【发布时间】:2009-07-13 16:41:38
【问题描述】:
我有一个非常奇怪的问题:
我有一个应用程序可以并行启动一些工作人员:
for (it = jobList.begin(); it != jobList.end(); it++) {
DWORD threadId;
Job job = *it;
Worker *worker = new Worker(job);
workers[i] = worker;
threads[i++] = CreateThread((LPSECURITY_ATTRIBUTES)NULL, (DWORD)0, &launchThread, worker, (DWORD)0, &threadId);
}
WaitForMultipleObjects((DWORD)jobList.size(), threads, (BOOL)true, (DWORD)INFINITE);
他们分配了一堆东西,所以我假设他们在新的地方同步,但这是他们最终相互同步的唯一地方。
当我在单核机器上运行应用程序时,一切都很好;当我在多核机器上启动应用程序时,性能变得差很多,比这更差:
for (it = jobList.begin(); it != jobList.end(); it++) {
DWORD threadId;
Job job = *it;
Worker *worker = new Worker(job);
workers[i] = worker;
threads[i++] = CreateThread((LPSECURITY_ATTRIBUTES)NULL, (DWORD)0, &launchThread, worker, (DWORD)0, &threadId);
WaitForSingleObject(threads[i-1], (DWORD)INFINITE);
}
有人给我一个合理的猜测吗?
编辑:
我进行了一些测试,发现:
- 使用最先进的并行分配器更改分配器无济于事
- 多线程应用的结果在有Core的机器上效果更好 2 双核(两个内核共享二级缓存)而不是双至强(两个处理器具有不同的缓存)。
我认为我手中的应用程序存在内存访问瓶颈,但是......我如何检查这是否真的是问题,或者我应该看看其他地方?
【问题讨论】:
-
不知道函数launchThread的作用就没有好办法知道,很可能是缓存线乒乓。
-
-1 没有提供足够的上下文。
-
“上下文”太大了,无法放入...
-
如果您在多核机器上运行此程序,但将进程限制为单个处理器,会发生什么情况? (Process Explorer 会让你这样做)
-
eran,好建议。我会尝试一下,然后更新问题:)
标签: c++ windows multithreading