c++ - 使用多线程优化执行时间(简单示例)

标签 c++ multithreading optimization boost concurrency

我有以下代码:

#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/cstdint.hpp> 
#include <iostream> 

int main() 
{ 
  boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time(); 

  boost::uint64_t sum = 0; 
  for (int i = 0; i < 1000000000; ++i) 
    sum += i; 

  boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time(); 
  std::cout << end - start << std::endl; 

  std::cout << sum << std::endl; 
}

任务是:重构以下程序,使用两个线程计算总数。由于现在许多处理器有两个内核,执行时间应该通过使用线程来减少。

这是我的解决方案:

#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread.hpp>
#include <boost/cstdint.hpp> 
#include <iostream> 


boost::uint64_t s1 = 0;
boost::uint64_t s2 = 0;

void sum1() 
{ 
  for (int i = 0; i < 500000000; ++i) 
    s1 += i; 
} 

void sum2()
{ 
  for (int i = 500000000; i < 1000000000; ++i) 
    s2 += i; 
}


int main() 
{ 
    boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time();

    boost::thread t1(sum1); 
    boost::thread t2(sum2); 

    t1.join(); 
    t2.join();

    boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time(); 
    std::cout << end - start << std::endl; 

    std::cout << s1+s2 << std::endl; 
} 

请查看并回答以下问题: 1. 为什么这段代码实际上并没有优化执行时间? :)(本人使用Intel Core i5处理器,Win7 64位系统) 2. 为什么当我使用一个变量s而不是s1s2来存储总和时,总和变得不正确?

提前致谢。

最佳答案

我会回答你的第二个问题,因为我还不清楚第一个问题。当您使用单个全局变量计算总和时,由于操作

s += i;

不是“原子的”,这意味着在汇编程序级别它被翻译成几条指令。如果一个线程正在执行这组指令,它可能会被另一个执行相同操作的线程中断,结果将不一致。

这是因为操作系统会在 CPU 上和下调度线程,并且无法预测线程将如何交错执行它们的指令。

这种情况下的经典模式是让两个局部变量收集每个线程的总和,然后在线程完成工作后将它们加在一起成为一个全局变量。

关于c++ - 使用多线程优化执行时间(简单示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9140833/

相关文章:

c++ - 禁用复制和 move 语义的最简洁方法

r - 从数值向量中采样等距点

wpf - 如何使调整 WPF 窗口的大小减少 "laggy"?

c++ - 错误 : "function" is private void, 错误:在此上下文中

c++ - 获取文件句柄作为参数

c++ - 如何在 3D 场景中使用和设置轴

multithreading - Scala - 可变线程安全集合

Python 在线程中处理 Socketserver 请求

c++ - 帮助在 MFC 中使用 CWinThread

matlab - 使用一组开始和结束索引索引数组