温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++多线程在Linux下的线程安全集合操作

发布时间:2024-11-15 18:18:03 来源:亿速云 阅读:78 作者:小樊 栏目:编程语言

在Linux下,使用C++多线程时,线程安全集合操作是非常重要的

  1. 使用互斥锁(std::mutex):

互斥锁是最基本的同步原语,用于确保在同一时刻只有一个线程可以访问共享资源。C++标准库提供了std::mutex类,可以用来保护共享数据。

#include <iostream>
#include <vector>
#include <thread>
#include <mutex>

std::mutex mtx;
std::vector<int> shared_data;

void add_data(int value) {
    std::lock_guard<std::mutex> lock(mtx);
    shared_data.push_back(value);
}

int main() {
    std::thread t1(add_data, 1);
    std::thread t2(add_data, 2);

    t1.join();
    t2.join();

    for (int value : shared_data) {
        std::cout << value << " ";
    }

    return 0;
}
  1. 使用原子操作(std::atomic):

原子操作是一种特殊的操作,可以在不使用锁的情况下保证线程安全。C++标准库提供了std::atomic模板类,可以用来保护简单的数据类型。

#include <iostream>
#include <vector>
#include <thread>
#include <atomic>

std::vector<int> shared_data;
std::atomic<int> counter(0);

void add_data(int value) {
    int index = counter.fetch_add(1);
    shared_data[index] = value;
}

int main() {
    std::thread t1(add_data, 1);
    std::thread t2(add_data, 2);

    t1.join();
    t2.join();

    for (int value : shared_data) {
        std::cout << value << " ";
    }

    return 0;
}
  1. 使用线程安全容器(std::concurrent_queue):

C++标准库提供了std::concurrent_queue模板类,这是一个线程安全的队列实现,可以在多线程环境下安全地使用。

#include <iostream>
#include <thread>
#include <concurrent_queue>

std::concurrent_queue<int> shared_queue;

void add_data(int value) {
    shared_queue.push(value);
}

void process_data() {
    int value;
    while (true) {
        if (shared_queue.try_pop(value)) {
            std::cout << value << " ";
        } else {
            std::this_thread::yield();
        }
    }
}

int main() {
    std::thread t1(add_data, 1);
    std::thread t2(add_data, 2);
    std::thread t3(process_data);

    t1.join();
    t2.join();
    t3.join();

    return 0;
}

注意:std::concurrent_queue不支持迭代器,因此不能像其他容器那样遍历它。在使用时,需要根据具体需求选择合适的线程安全集合操作。

向AI问一下细节

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

c++
AI