在C++中,有多种方法可以实现同步。以下是一些常用的同步机制:
- 互斥锁(Mutex):互斥锁是一种用于保护共享资源的同步原语。当一个线程获得互斥锁时,其他线程必须等待该线程释放锁才能访问共享资源。C++标准库中的
std::mutex
和std::lock_guard
可以用于实现互斥锁。
#include
#include
#include
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;
}
- 条件变量(Condition Variable):条件变量是一种用于线程间通信的同步原语。它允许一个线程等待某个条件成立,同时释放互斥锁,让其他线程继续执行。当条件成立时,等待的线程会被唤醒并重新获取互斥锁。C++标准库中的
std::condition_variable
和std::unique_lock
可以用于实现条件变量。
#include
#include
#include
#include
std::mutex mtx; // 全局互斥锁
std::condition_variable cv; // 全局条件变量
int data = https://www.yisu.com/ask/0; // 全局数据"hljs">void worker(int n) {
std::unique_lock 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;
}
- 原子操作(Atomic Operations):原子操作是一种不可被中断的操作,用于实现无锁编程。C++11标准库中的
std::atomic
可以用于实现原子操作。
#include
#include
#include
std::atomic 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;
}
这些同步机制可以根据具体需求进行组合使用,以实现线程间的同步操作。