6.5. 练习

You can buy solutions to all exercises in this book as a ZIP file.

  • 重构下面的程序用两个线程来计算总和。由于现在许多处理器有两个内核,应利用线程减少执行时间。
  1. #include <boost/date_time/posix_time/posix_time.hpp>
  2. #include <boost/cstdint.hpp>
  3. #include <iostream>
  4.  
  5. int main()
  6. {
  7. boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time();
  8.  
  9. boost::uint64_t sum = 0;
  10. for (int i = 0; i < 1000000000; ++i)
  11. sum += i;
  12.  
  13. boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time();
  14. std::cout << end - start << std::endl;
  15.  
  16. std::cout << sum << std::endl;
  17. }
  • 下载源代码
    • 通过利用处理器尽可能同时执行多的线程,把例1一般化。 例如,如果处理器有四个内核,就应该利用四个线程。
  • 修改下面的程序,在 main()中自己的线程中执行 thread() 。 程序应该能够计算总和,然后把结果输入到标准输出两次。 但可以更改 calculate()print()thread() 的实现,每个函数的接口仍需保持一致。 也就是说每个函数应该仍然没有任何参数,也不需要返回一个值。
  1. #include <iostream>
  2.  
  3. int sum = 0;
  4.  
  5. void calculate()
  6. {
  7. for (int i = 0; i < 1000; ++i)
  8. sum += i;
  9. }
  10.  
  11. void print()
  12. {
  13. std::cout << sum << std::endl;
  14. }
  15.  
  16. void thread()
  17. {
  18. calculate();
  19. print();
  20. }
  21.  
  22. int main()
  23. {
  24. thread();
  25. }