【发布时间】:2017-12-26 09:20:56
【问题描述】:
我想在 MFC 中使用多线程。我正在做一个小实验,看看程序是否以并行方式运行。我这样写了两个线程函数:
UINT CMFCApplication2Dlg::thread01(LPVOID pParam)
{
clock_t t1, t2;
t1 = clock();
for (int i = 0; i < 300000; i++)
cout << "thread01111111111" << endl;
t2 = clock();
cout << "clock is " << t2 - t1 << endl;
return 0;
}
UINT CMFCApplication2Dlg::thread02(LPVOID pParam)
{
clock_t t1, t2;
t1 = clock();
for (int i = 0; i < 300000; i++)
cout << "thread02222222222" << endl;
t2 = clock();
cout << "clock is " << t2 - t1 << endl;
return 0;
}
并调用它们并输出到控制台窗口:
AllocConsole();
freopen("CONOUT$", "w+t", stdout);
freopen("CONIN$", "r+t", stdin);
printf("Hello World!\n");
CWinThread *pThread01;
CWinThread *pThread02;
pThread01 = AfxBeginThread(thread01, this, 0, 0, 0, NULL);
pThread02 = AfxBeginThread(thread02, this, 0, 0, 0, NULL);
同时运行两个线程时,计数为118020;单线程运行时,计数为60315;当以串行方式将两个循环放在同一个线程中时,我得到 102795。
我以前认为编译器可以优化多线程自动并行执行,但似乎单核多线程并发可以。它不会减少运行时间。我使用的 CPU 有 4 个内核。我应该怎么做才能在不同的核心并行运行线程以实现高性能?
【问题讨论】:
-
这个问题没有意义。它遵循“多线程是答案,问题是什么?”图案。如果您想要更好的答案,您需要提出更好的问题(即编写更好的测试代码)。如果您已经知道答案,您只能提出更好的问题。
-
对不起,我不能完全理解你的意思。如果你的意思是测试代码太糟糕,那可能是因为我没有接受过正式的 CS 培训。您可以直接参考我的代码中的不足。
-
您的代码使用全局资源(大概是
std::cout),当从多个线程访问时,它不保证输出顺序。因此,使用观察到的输出顺序作为逻辑推理的基础并不是很有用。您无法根据不可靠的输入推断出可靠的结果。你需要一本关于并发的好书,以及一本关于 CPU 架构的好书。另外,一本关于 MFC 的好书,如果你想使用 MFC。 -
感谢您的指正。好吧,我不想深入研究 MFC,因为我听说它已经很老了。那么还有其他高效的 GUI 支持的多线程值得学习吗?答案是否引用了 MSDN 中的并发运行时好学?还是有其他建议?
-
任何东西(包括MFC)都很好学,这样你就可以做出明智的决定。根据您听说某些技术已经过时而做出决定,这不是一个好的决定,只有靠运气才能做出正确的决定。
标签: c++ multithreading mfc