多线程数据交互实战:C++经典案例解析与代码实现

在多线程编程中,数据交互是关键问题之一。合理地处理线程间的数据交互,可以有效地提高程序的性能和效率。本文将围绕C++多线程编程,解析经典案例,并给出相应的代码实现。
案例一:生产者-消费者问题
生产者-消费者问题是多线程编程中的经典问题。在生产者-消费者模式中,生产者线程负责生产数据,消费者线程负责消费数据。为了保证生产者和消费者之间的协调,通常需要一个共享缓冲区。
以下是一个基于互斥锁和条件变量的生产者-消费者问题的实现:
#include
#include #include
#include
#include

std::mutex mtx;
std::condition_variable cv;
std::queue dataQueue;
int counter = 0;

void producer() {
for (int i = 0; i < 10; ++i) { { std::unique_lock lock(mtx);
dataQueue.push(i);
++counter;
lock.unlock();
cv.notify_one();
}
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}

void consumer() {
while (true) {
{
std::unique_lock lock(mtx);
cv.wait(lock, []{return !dataQueue.empty();});
std::cout << "Consumer got: " << dataQueue.front() << std::endl; dataQueue.pop(); --counter; lock.unlock(); } std::this_thread::sleep_for(std::chrono::milliseconds(100)); if (counter == 0) break; } } int main() { std::thread prod(producer); std::thread cons(consumer); prod.join(); cons.join(); return 0; } 案例二:读写锁 读写锁是一种允许多个线程同时读取共享资源,但只允许一个线程写入共享资源的锁。以下是一个基于读写锁的线程安全队列的实现: #include
#include #include
#include
#include

std::shared_mutex mtx;
std::queue dataQueue;

void producer() {
for (int i = 0; i < 10; ++i) { { std::unique_lock lock(mtx);
dataQueue.push(i);
}
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}

void consumer() {
while (true) {
{
std::shared_lock lock(mtx);
if (!dataQueue.empty()) {
std::cout << "Consumer got: " << dataQueue.front() << std::endl; dataQueue.pop(); } } std::this_thread::sleep_for(std::chrono::milliseconds(100)); } } int main() { std::thread prod(producer); std::thread cons(consumer); prod.join(); cons.join(); return 0; } 总结 本文介绍了两个C++多线程编程的经典案例,并给出了相应的代码实现。在实际编程中,合理地处理线程间的数据交互,可以有效地提高程序的性能和效率。希望本文能对您有所帮助。