gpt4 book ai didi

c++ - MFC多线程程序可以并行运行吗?

转载 作者:行者123 更新时间:2023-11-30 03:26:50 25 4
gpt4 key购买 nike

我想在 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 个内核。如何在不同核心并行运行线程以实现高性能?

最佳答案

两个线程都试图同时使用共享资源 (std::cout)。系统必须在某一时刻序列化输出,因此大多数时候一个线程将等待另一个线程完成写入。这称为同步。当您使用线程来提高性能时,您希望尽可能减少同步花费的时间,因为在这段时间内线程无法完成有用的工作。

尝试用冗长的计算替换内循环中的cout,并且只在最后使用cout打印最终结果,因此编译器无法优化计算离开(没有 cout 它可以,因为计算不会有任何可观察到的效果)。

此外,std::clock 缺乏分析精度。我建议使用 std::chrono::high_resolution_clock相反,它通常是在 Windows 平台上使用 QueryPerformanceCounter() 实现的。这是您在 Windows 上可以获得的最佳体验。

试试这个:

INT CMFCApplication2Dlg::thread01(LPVOID pParam)
{
using myclock = std::chrono::high_resolution_clock;
auto t1 = myclock::now();

std::int64_t first = 0, second = 1, result = 0;
for( std::int64_t i = 0; i < 10000000; ++i )
{
result = first + second;
first = second;
second = result;
}

auto t2 = myclock::now();
std::chrono::duration<double> td = t2 - t1; // duration in seconds

std::cout << "result is " << result << '\n'
<< "clock is " << std::fixed << std::setprecision( 6 ) << td.count() << " s" << std::endl;

return 0;
}

确保计算不是太简单,因为优化器非常聪明,可能会将您的 O(n) 算法变成例如 O(1)。它甚至可以在编译时完成整个计算,只在运行时分配一个常量。为避免这种情况,您可以改为从 cin 中读取循环迭代次数。虽然在 MSVC 2017 上测试上述代码时没有必要这样做,即使是完全优化也是如此。

关于c++ - MFC多线程程序可以并行运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47976355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com