C++中常用的并发编程
C++中常用的并发编程方式有以下几种:
- 多线程:使用 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;
}
- 原子操作:使用 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;
}
- 条件变量:使用 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;
}
- 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;
}
- 并行算法:使用 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;
}