如何在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)之前需要获取互斥锁。当条件满足时,消费者线程可以安全地访问共享数据,然后重置共享数据并继续等待。
版权声明:如无特殊标注,文章均为本站原创,转载时请以链接形式注明文章出处。
评论