21xrx.com
2024-12-22 21:34:22 Sunday
登录
文章检索 我的文章 写文章
C++ 多线程数组操作
2023-07-04 20:20:15 深夜i     --     --
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++ 多线程数组操作可以大大加快程序的速度,但需要注意线程间的同步和互斥。在实际应用中,还需要考虑数据的分布和负载均衡等问题,在设计多线程算法时应该综合考虑各种因素。

  
  

评论区

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