C++多线程数据交互
时间: 2024-12-27 22:18:33 浏览: 9
### C++ 多线程环境下的数据交互方法和机制
#### 使用互斥锁 (Mutex)
为了避免多个线程同时访问共享资源而导致的数据竞争问题,在 C++ 中可以使用 `std::mutex` 来保护临界区。当一个线程进入临界区时,它会锁定互斥量;其他尝试获取该互斥量的线程将会被阻塞直到第一个线程释放互斥量。
```cpp
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
std::vector<int> shared_data;
std::mutex mtx;
void add_to_vector(int value) {
std::lock_guard<std::mutex> lock(mtx); // 自动管理 mutex 锁定与解锁
shared_data.push_back(value);
}
```
这段代码展示了如何利用 `std::lock_guard` 对象来简化对 `std::mutex` 的操作[^1]。每当执行到此函数内部时,都会自动加锁并确保离开作用域时解锁。
#### 原子变量 (Atomic Variables)
对于简单的整数类型或其他内置类型的同步需求,可以直接采用原子类型 (`std::atomic`) 进行无锁编程。这允许并发读写而不会引发竞态条件。
```cpp
#include <atomic>
#include <thread>
std::atomic<int> counter(0);
void increment_counter() {
++counter; // 安全地增加计数值
}
int main() {
const int num_threads = 10;
std::thread threads[num_threads];
for (auto& t : threads)
t = std::thread(increment_counter);
for (auto& t : threads)
t.join();
std::cout << "Final count: " << counter.load() << '\n';
}
```
这里定义了一个名为 `counter` 的全局原子型整数,并由十个独立的工作线程对其进行递增操作[^2]。
#### 线程间通信:条件变量 (Condition Variable)
有时需要等待某个特定事件发生后再继续执行后续逻辑,则可借助于 `std::condition_variable` 实现高效的生产者-消费者模式。
```cpp
#include <queue>
#include <mutex>
#include <condition_variable>
std::queue<int> data_queue;
std::mutex queue_mutex;
std::condition_variable cv;
bool done = false;
void producer(const std::string& id, int max_items) {
for (int i = 0; i < max_items && !done; ++i) {
std::unique_lock<std::mutex> lk(queue_mutex);
data_queue.push(i);
cv.notify_one(); // 通知其中一个正在等待的消费者
lk.unlock();
}
}
void consumer(const std::string& id) {
while (!done || !data_queue.empty()) {
std::unique_lock<std::mutex> lk(queue_mutex);
cv.wait(lk, [] {return !data_queue.empty() || done; });
if (!data_queue.empty()) {
auto item = data_queue.front();
data_queue.pop();
std::cout << id << ": Consumed " << item << "\n";
} else if (done){
break;
}
}
}
```
上述例子中展示了一种典型的生产者-消费者的实现方式,其中涉及到队列、互斥体以及条件变量三者的配合工作[^3]。
阅读全文