C++中常用的并发编程方式有以下几种:

  1. 多线程:使用 std::thread 可以创建多个线程来同时执行不同的任务。需要注意的是,多线程编程需要考虑线程安全问题,例如使用互斥锁(std::mutex)和条件变量(std::condition_variable)等来保证共享资源的安全访问。

示例代码:

cpp

#include <iostream>
#include <thread>

void printHello() {
  std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl;
}

int main() {
  std::thread t1(printHello);
  std::thread t2(printHello);

  t1.join();
  t2.join();

  return 0;
}
  1. 原子操作:使用 std::atomic 可以进行原子操作,保证对共享资源的读写操作是原子的,从而避免数据竞争问题。

示例代码:

cpp

#include <iostream>
#include <thread>
#include <atomic>

std::atomic<int> count(0);

void increment() {
  for (int i = 0; i < 1000000; ++i) {
    count++;
  }
}

void decrement() {
  for (int i = 0; i < 1000000; ++i) {
    count--;
  }
}

int main() {
  std::thread t1(increment);
  std::thread t2(decrement);

  t1.join();
  t2.join();

  std::cout << "Final count is " << count << std::endl;

  return 0;
}
  1. 条件变量:使用 std::condition_variable 可以在多个线程之间同步共享数据的状态。它可以让线程在满足特定条件之前一直等待,从而避免了忙等的情况。

示例代码:

cpp

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mutex_;
std::condition_variable cond_;
bool ready = false;

void worker() {
  std::unique_lock<std::mutex> lock(mutex_);

  while (!ready) {
    cond_.wait(lock);
  }

  std::cout << "Worker thread is running" << std::endl;
}

int main() {
  std::thread t(worker);

  std::this_thread::sleep_for(std::chrono::seconds(5));

  {
    std::lock_guard<std::mutex> lock(mutex_);
    ready = true;
  }

  cond_.notify_one();

  t.join();

  return 0;
}
  1. future/promise:使用 std::future 和 std::promise 可以在一个线程中等待另一个线程的结果。std::future 表示一个异步操作的结果,而 std::promise 则可以设置该结果。

示例代码:

cpp

#include <iostream>
#include <thread>
#include <future>

void worker(std::promise<int>& promise) {
  std::this_thread::sleep_for(std::chrono::seconds(5));

  promise.set_value(42);
}

int main() {
  std::promise<int> promise;
  std::future<int> future = promise.get_future();

  std::thread t(worker, std::ref(promise));

  std::cout << "Waiting for result" << std::endl;
  std::cout << "Result is " << future.get() << std::endl;

  t.join();

  return 0;
}
  1. 并行算法:使用 std::execution::par 执行算法可以在多个线程之间并行执行操作。

示例代码:

cpp

#include <iostream>
#include <vector>
#include <algorithm>
#include <execution>

int main() {
  std::vector<int> vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

  std::for_each(std::execution::par, vec.begin(), vec.end(), [](int& n) {
    n *= n;
  });

  for (int n : vec) {
    std::cout << n << ' ';
  }
  std::cout << std::endl;

  return 0;
}