在C++中,有多種方法可以實現同步。以下是一些常用的同步機制:
std::mutex
和std::lock_guard
可以用于實現互斥鎖。#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; // 全局互斥鎖
void print_block(int n, char c) {
mtx.lock(); // 獲取互斥鎖
for (int i = 0; i < n; ++i) {
std::cout << c;
}
std::cout << std::endl;
mtx.unlock(); // 釋放互斥鎖
}
int main() {
std::thread th1(print_block, 50, '*');
std::thread th2(print_block, 50, '$');
th1.join();
th2.join();
return 0;
}
std::condition_variable
和std::unique_lock
可以用于實現條件變量。#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx; // 全局互斥鎖
std::condition_variable cv; // 全局條件變量
int data = 0; // 全局數據
void worker(int n) {
std::unique_lock<std::mutex> lock(mtx); // 獲取互斥鎖
cv.wait(lock, [] { return data >= n; }); // 等待條件成立
for (int i = 0; i < n; ++i) {
std::cout << data++ << ' ';
}
std::cout << std::endl;
cv.notify_one(); // 喚醒等待的線程
}
int main() {
std::thread th1(worker, 5);
std::thread th2(worker, 10);
th1.join();
th2.join();
return 0;
}
std::atomic
可以用于實現原子操作。#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> counter(0); // 全局原子計數器
void increment(int n) {
for (int i = 0; i < n; ++i) {
counter.fetch_add(1); // 原子加1
}
}
int main() {
std::thread th1(increment, 1000);
std::thread th2(increment, 1000);
th1.join();
th2.join();
std::cout << "Counter: " << counter.load() << std::endl;
return 0;
}
這些同步機制可以根據具體需求進行組合使用,以實現線程間的同步操作。