<atomic> 注释3:memory_order_release发布,memory_order_acquire 接收,memory_order_acq_rel发送与接收

(8)memory_order_release 发布 , 这也是一种多线程中的内存管理形式

在这里插入图片描述

++ 举例:

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

std::atomic<int> flag(0);
int data = 0;

void writer() {
    data = 42;  // 对非原子变量的写
    flag.store(1, std::memory_order_release);  // 使用 memory_order_release 标记原子操作
}

void reader() {
    while (flag.load(std::memory_order_acquire) == 0) {
        // 等待
    }
    // 此时,data 一定已经被写入为 42
    std::cout << "Data: " << data << std::endl;
}

int main() {
    std::thread t1(writer);
    std::thread t2(reader);
    t1.join();
    t2.join();
    return 0;
}

在这里插入图片描述

(9) memory_order_acquire 接收

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

++举例:

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

std::atomic<bool> ready(false);
int data = 0;

void producer() {
    data = 42;  // 写入数据
    ready.store(true, std::memory_order_release);  // 释放数据,使用 memory_order_release
}

void consumer() {
    while (!ready.load(std::memory_order_acquire)) {
        // 等待数据准备好
    }
    // 此时,data 一定已经被写入为 42
    std::cout << "Data: " << data << std::endl;
}

int main() {
    std::thread t1(producer);
    std::thread t2(consumer);
    t1.join();
    t2.join();
    return 0;
}

在这里插入图片描述

++ 以上两个举例也提供了宝贵的 atomic《T》 的使用范例 。

(10) memory_order_acq_rel发送与接收

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

++ 举例:

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

std::atomic<int> flag(0);
int shared_data = 0;

void writer() {
    shared_data = 42;  // 写入数据
    flag.store(1, std::memory_order_release);  // 释放数据,使用 memory_order_release
}

void reader() {
    int local_flag;
    while ((local_flag = flag.load(std::memory_order_acquire)) != 1) {
        // 等待数据准备好
    }
    // 此时,shared_data 一定已经被写入为 42
    std::cout << "Shared Data: " << shared_data << std::endl;
    flag.store(0, std::memory_order_release);  // 重置标志位,使用 memory_order_release
}

void reader_with_acq_rel() {
    int expected = 1;
    while (!flag.compare_exchange_strong(expected, 0, std::memory_order_acq_rel)) {
        // 等待并尝试获取标志位,使用 memory_order_acq_rel
        expected = 1;  // 如果交换失败,则重新设置期望值
    }
    // 此时,shared_data 一定已经被写入为 42(因为 compare_exchange_strong 成功了)
    std::cout << "Shared Data (with acq_rel): " << shared_data << std::endl;
}

int main() {
    std::thread t1(writer);
    std::thread t2(reader);
    std::thread t3(reader_with_acq_rel);
    t1.join();
    t2.join();
    t3.join();
    return 0;
}

在这里插入图片描述

(11)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值