21xrx.com
2025-03-28 05:36:02 Friday
文章检索 我的文章 写文章
C++ 多线程数组操作
2023-07-04 20:20:15 深夜i     16     0
C++ 多线程 数组操作

C++ 是一种被广泛使用的编程语言,其支持多线程编程。对于数组操作,多线程能够加快程序的运行速度,但同时也需要注意线程间的同步与互斥。

为了实现多线程数组操作,我们可以使用 std::thread 类。它可以帮助我们创建并运行线程。下面是一个简单的例子:

#include <iostream>
#include <thread>
#include <vector>
void worker(std::vector<int>& arr, int start, int end, int increment) {
  for(int i = start; i < end; i += increment) {
    arr[i] = arr[i] * 2;
  }
}
int main() {
  std::vector<int> arr = 1;
  int numThreads = 4;
  std::vector<std::thread> threads(numThreads);
  for(int i = 0; i < numThreads; i++) {
    threads[i] = std::thread(worker, std::ref(arr), i, arr.size(), numThreads);
  }
  for(int i = 0; i < numThreads; i++) {
    threads[i].join();
  }
  for(int i = 0; i < arr.size(); i++) {
    std::cout << arr[i] << " ";
  }
  std::cout << std::endl;
  return 0;
}

在上面的例子中,我们要将数组中所有元素乘以 2。worker 函数接受四个参数:要操作的数组、起始索引、结束索引和递增步长。main 函数创建了四个线程,每个线程操作数组的一部分,最后等待所有线程完成后输出结果。

此外,我们还需要控制线程间的同步和互斥。常用的同步方式包括互斥量(mutex)和条件变量(condition variable)。例如,如果我们要在线程完成运算后输出结果,可以使用条件变量来等待所有线程完成:

#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
#include <condition_variable>
void worker(std::vector<int>& arr, int start, int end, int increment, std::condition_variable& cv, std::mutex& mtx, int& count) {
  for(int i = start; i < end; i += increment) {
    arr[i] = arr[i] * 2;
  }
  {
    std::unique_lock<std::mutex> lock(mtx);
    count--;
    if(count == 0) {
      cv.notify_all();
    }
  }
}
int main() {
  std::vector<int> arr = 9;
  int numThreads = 4;
  std::vector<std::thread> threads(numThreads);
  std::mutex mtx;
  std::condition_variable cv;
  int count = numThreads;
  for(int i = 0; i < numThreads; i++) {
    threads[i] = std::thread(worker, std::ref(arr), i, arr.size(), numThreads, std::ref(cv), std::ref(mtx), std::ref(count));
  }
  {
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, [&count](){return count == 0;});
  }
  for(int i = 0; i < arr.size(); i++) {
    std::cout << arr[i] << " ";
  }
  std::cout << std::endl;
  return 0;
}

在上面的例子中,我们定义了一个互斥量和一个条件变量,用于等待所有线程完成。count 变量用于记录还有多少个线程没有完成运算。在 worker 函数中,每个线程完成运算后会对 count 减一,并检查是否是最后一个线程,如果是则唤醒所有等待条件变量的线程。在 main 函数中,我们使用了一个 lambda 表达式来检查 count 是否为 0,如果是则解锁互斥量并返回。最后输出结果。

总的来说,C++ 多线程数组操作可以大大加快程序的速度,但需要注意线程间的同步和互斥。在实际应用中,还需要考虑数据的分布和负载均衡等问题,在设计多线程算法时应该综合考虑各种因素。

  
  

评论区