21xrx.com
2024-09-20 00:41:05 Friday
登录
文章检索 我的文章 写文章
C++多线程并行执行:提升程序运行效率的利器
2023-06-21 03:50:04 深夜i     --     --
C++ 多线程 并行执行 程序运行效率 利器

C++多线程并行执行,是提升程序运行效率的利器。在计算机程序开发中,通常使用单线程方式执行程序,但随着计算机硬件的推进,多核CPU已经成为标配,无法利用多线程技术执行程序,必然会使程序运行效率大幅度降低,而多线程并行执行可以非常有效地避免这种情况。

C++的多线程技术被广泛应用于各种类型的程序中,例如图形处理、人工智能、网络通讯等。然而,多线程并行执行应该合理应用,避免出现死锁、资源竞争等问题。

多线程并行执行可以通过boost、STL等库来实现。C++11标准中也提供了Thread、Condition Variable、Mutex等标准库支持,使得多线程编写变得更加容易和直观。下面通过一个简单的示例介绍C++多线程并行执行的基本原理。

假设我们要计算1到1000000的所有数字的和,下面是单线程的实现:


#include <iostream>

#include <chrono>

int main()

{

 int sum = 0;

 auto start = std::chrono::high_resolution_clock::now();

 for (int i = 1; i <= 1000000; i++)

 {

  sum += i;

 }

 auto end = std::chrono::high_resolution_clock::now();

 std::chrono::duration<double> diff = end - start;

 std::cout << "Elapsed time: " << diff.count() << " s\n";

 std::cout << "Sum: " << sum << "\n";

 return 0;

}

通过运行上面的代码,可以得到以下结果:


Elapsed time: 0.000465566 s

Sum: 500000500000

接下来,我们通过多线程并行执行来计算1到1000000的所有数字的和,具体的实现如下:


#include <iostream>

#include <vector>

#include <thread>

#include <chrono>

#include <numeric>

void accumulate(std::vector<int>::iterator start, std::vector<int>::iterator end, int& result)

{

 result = std::accumulate(start, end, 0);

}

int main()

{

 int result1, result2, result3, result4;

 std::vector<int> numbers(1000000);

 std::iota(numbers.begin(), numbers.end(), 1);

 auto start = std::chrono::high_resolution_clock::now();

 std::thread t1(accumulate, numbers.begin(), numbers.begin() + 250000, std::ref(result1));

 std::thread t2(accumulate, numbers.begin() + 250000, numbers.begin() + 500000, std::ref(result2));

 std::thread t3(accumulate, numbers.begin() + 500000, numbers.begin() + 750000, std::ref(result3));

 std::thread t4(accumulate, numbers.begin() + 750000, numbers.end(), std::ref(result4));

 t1.join();

 t2.join();

 t3.join();

 t4.join();

 auto end = std::chrono::high_resolution_clock::now();

 std::chrono::duration<double> diff = end - start;

 std::cout << "Elapsed time: " << diff.count() << " s\n";

 std::cout << "Sum: " << result1+result2+result3+result4 << "\n";

 return 0;

}

上面的代码创建了4个线程,并分别计算前4个部分的和。每个线程最终的计算结果都被传递回主线程,最终统一求和得到1到1000000的所有数字的和。

通过运行上述代码,我们可以得到以下结果:


Elapsed time: 0.00255809 s

Sum: 500000500000

可以看出,通过多线程并行执行,计算1到1000000的所有数字的和的时间从0.000465566秒降低到了0.00255809秒,运行效率得到了显著提升。

当然,在使用多线程并行执行时,需要留意一些问题,例如死锁、资源竞争等。但只要合理使用多线程技术,并避免上述问题,多线程并行执行可以帮助我们更好地利用CPU资源,提升程序运行效率。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复