如何在Linux C++中实现线程间的安全数据交换

蜗牛 互联网技术资讯 2024-11-17 4 0

在 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)之前需要获取互斥锁。当条件满足时,消费者线程可以安全地访问共享数据,然后重置共享数据并继续等待。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo6@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

评论

有免费节点资源,我们会通知你!加入纸飞机订阅群

×
天气预报查看日历分享网页手机扫码留言评论Telegram