C++ 如何实现C++的线程的同步
时间: 2024-09-11 12:13:49 浏览: 58
在C++中,实现线程同步主要是为了协调多个线程之间的执行顺序和共享资源的访问,防止出现竞态条件等并发问题。C++提供了多种机制来实现线程同步,以下是一些常用的方法:
1. 互斥锁(Mutex):互斥锁是最基本的同步机制之一,用于控制对共享资源的互斥访问。一个互斥锁可以保证任何时候只有一个线程可以访问该资源。C++11之后的标准库中提供了`std::mutex`类来实现互斥锁。
```cpp
#include <mutex>
#include <thread>
std::mutex mtx; // 定义一个互斥锁
void func() {
mtx.lock(); // 上锁
// 临界区开始
// 执行共享资源的操作
// 临界区结束
mtx.unlock(); // 解锁
}
int main() {
std::thread t1(func);
std::thread t2(func);
t1.join();
t2.join();
return 0;
}
```
2. 读写锁(Read-Write Lock):`std::shared_mutex`在C++17中引入,可以允许多个读操作同时进行,但写操作时互斥。这对于读操作远多于写操作的场景非常有用。
```cpp
#include <shared_mutex>
#include <mutex>
std::shared_mutex rw_mutex; // 定义一个读写锁
void read_data() {
rw_mutex.lock_shared(); // 读锁定
// 执行共享资源的读操作
rw_mutex.unlock_shared(); // 读解锁
}
void write_data() {
rw_mutex.lock(); // 写锁定
// 执行共享资源的写操作
rw_mutex.unlock(); // 写解锁
}
// 注意:在实际代码中应该对读写操作进行适当的保护,确保数据的一致性。
```
3. 条件变量(Condition Variables):条件变量与互斥锁一起使用,允许线程等待某个条件成立。当条件不满足时,线程可以挂起等待;当条件成立时,线程被唤醒继续执行。
```cpp
#include <condition_variable>
#include <mutex>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void print_id(int id) {
std::unique_lock<std::mutex> lck(mtx);
while (!ready) {
cv.wait(lck); // 当条件不满足时,线程阻塞等待
}
// 当条件满足时,线程继续执行
std::cout << "thread " << id << '\n';
}
void go() {
std::unique_lock<std::mutex> lck(mtx);
ready = true;
cv.notify_all(); // 通知所有等待的线程条件已满足
}
int main() {
std::thread threads[10];
for (int i = 0; i < 10; ++i) {
threads[i] = std::thread(print_id, i);
}
go();
for (auto& th : threads) {
th.join();
}
return 0;
}
```
4. 原子操作:C++提供了原子操作库`std::atomic`,允许执行不可分割的操作,这些操作在多线程环境下是原子性的,从而保证了操作的同步性。
```cpp
#include <atomic>
#include <thread>
std::atomic<int> atomic_var(0);
void increment() {
atomic_var.fetch_add(1, std::memory_order_relaxed);
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << atomic_var.load() << std::endl; // 输出最终结果
return 0;
}
```
阅读全文