如何在Linux C++中实现线程间的安全数据交换
在 Linux 中,使用 C++ 实现线程间的安全数据交换通常需要使用互斥锁(mutex)和条件变量(condition variable)
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <vector>
std::mutex mtx; // 全局互斥锁
std::condition_variable cv; // 全局条件变量
int shared_data = 0; // 共享数据
// 生产者线程函数
void producer() {
for (int i = 0; i < 10; ++i) {
std::unique_lock<std::mutex> lock(mtx); // 获取互斥锁
shared_data += 1; // 修改共享数据
std::cout << "Producer: " << shared_data << std::endl;
cv.notify_one(); // 通知消费者线程
lock.unlock(); // 释放互斥锁
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟耗时操作
}
}
// 消费者线程函数
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx); // 获取互斥锁
cv.wait(lock, []{ return shared_data > 0; }); // 等待条件变量满足
std::cout << "Consumer: " << shared_data << std::endl;
shared_data = 0; // 重置共享数据
lock.unlock(); // 释放互斥锁
}
}
int main() {
std::thread producer_thread(producer); // 创建生产者线程
std::thread consumer_thread(consumer); // 创建消费者线程
producer_thread.join(); // 等待生产者线程结束
consumer_thread.join(); // 等待消费者线程结束
return 0;
}
在这个示例中,我们使用了一个全局互斥锁 mtx
和一个全局条件变量 cv
来确保线程间的安全数据交换。生产者线程在修改共享数据之前需要获取互斥锁,修改完成后通知消费者线程。消费者线程在等待条件变量满足(即共享数据大于 0)之前需要获取互斥锁。当条件满足时,消费者线程可以安全地访问共享数据,然后重置共享数据并继续等待。
版权声明:如无特殊标注,文章均为本站原创,转载时请以链接形式注明文章出处。
评论