21xrx.com
2024-06-02 23:07:30 Sunday
登录
文章检索 我的文章 写文章
C++多线程编程实例:实用案例详解
2023-07-05 00:57:36 深夜i     --     --
C++ 多线程 编程 实例 实用案例详解

C++ 多线程编程在现代计算机领域中已经得到了广泛的应用。它不仅可以充分利用多核处理器提高计算机的效率,而且还可以帮助处理一些需要并行执行的任务,提高处理速度和性能。

这里我们将详细介绍一些实用案例,帮助您更好地理解 C++ 多线程编程实现的方法和技巧。

例一:并行计算

首先,我们来看一个例子:如何用多线程计算一个数组的总和。假设我们有一个长度为 1000000 的数组 a,我们想计算该数组的总和,可以使用如下的代码:


#include <iostream>

#include <thread>

using namespace std;

const int size = 1000000;

double a[size];

void compute(int start, int end, double& result){

  double sum = 0;

  for(int i = start; i < end; ++i){

    sum += a[i];

  }

  result = sum;

}

int main(){

  for(int i = 0; i < size; ++i){

    a[i] = 1;

  }

  double sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0; //分别用来记录 4 个线程的计算结果

  thread t1(compute, 0, size/4, std::ref(sum1));

  thread t2(compute, size/4, size/2, std::ref(sum2));

  thread t3(compute, size/2, size*3/4, std::ref(sum3));

  thread t4(compute, size*3/4, size, std::ref(sum4));

  t1.join();

  t2.join();

  t3.join();

  t4.join();

  double sum = sum1 + sum2 + sum3 + sum4;

  std::cout << "Sum: " << sum << std::endl;

  return 0;

}

在这个例子中,我们首先创建了一个长度为 1000000 的数组 a,将每个元素的值初始化为 1。然后,在主函数中,我们创建了 4 个线程,每个线程分别计算数组 a 的四分之一。在每个线程中,我们使用了一个 for 循环来计算数组 a 的元素之和,并将这个结果记录到对应的变量中。

最后,我们将这 4 个线程的计算结果汇总在一起,得到整个数组 a 的总和,并将其输出到命令行中。

例二:并行读写共享内存

在多线程编程中,共享内存的读写是一个比较常见的问题。如果多个线程同时读写共享内存,那么就存在竞争条件。为了避免这种竞争,我们需要使用锁来同步线程的访问。

下面是一个简单的例子,演示了如何使用多线程读写共享内存。


#include <iostream>

#include <thread>

#include <mutex>

using namespace std;

const int size = 1000000;

int buffer[size]; //共享内存缓冲区

mutex mutex_lock; //互斥锁

void writer(){

  for(int i = 0; i < size; ++i){

    mutex_lock.lock(); //加锁

    buffer[i] = i;

    mutex_lock.unlock(); //解锁

  }

}

void reader(){

  for(int i = 0; i < size; ++i){

    mutex_lock.lock(); //加锁

    int value = buffer[i];

    mutex_lock.unlock(); //解锁

    std::cout << value << " ";

  }

  std::cout << std::endl;

}

int main(){

  thread t1(writer);

  thread t2(reader);

  t1.join();

  t2.join();

  return 0;

}

在这个例子中,我们创建了一个长度为 1000000 的整型数组 buffer。然后,我们在 writer 函数中使用 for 循环向缓冲区中写入数据。在每次写操作之前,我们使用 mutex_lock 对象进行加锁,以确保在写操作期间不会发生竞争。

与此类似,在 reader 函数中,我们使用 for 循环遍历缓冲区中的所有元素。在每次读操作之前,我们同样使用 mutex_lock 对象进行加锁,以确保在读操作期间不会发生竞争。

在主函数中,我们创建了两个线程,分别执行 writer 和 reader 函数。这样就实现了一个简单的多线程读写共享内存的例子。

总结

本文介绍了两个用 C++ 实现的多线程编程例子。第一个例子是如何利用多线程计算数组的总和,第二个例子是如何使用多线程读写共享内存。

在实际编程中,多线程编程往往会遇到复杂的问题,需要使用更加高级的技术和工具来解决。但是,掌握基本的多线程编程技巧是一个必要的前提。希望这些例子能够帮助您更好地理解多线程编程的基本方法和思路。

  
  

评论区

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