C++20 Atomic 原子 内存模型(二)

C++20 Atomic 原子 内存模型(二)

原子是C++内存模型的基础

强/弱内存模型

1. 强内存模型

Leslie Lamport 定义了顺序一致性的概念

顺序一致性提供两个保证:

  • 指令按源码的顺序执行
  • 对所有线程的所有指令有全局的顺序

以上不仅仅作用于原子, 也影响着非原子变量

image-20220807141634808

int main(int argc, char* argv[])
{atomic<int> x(0);atomic<int> y(0);atomic<int> res1(0);atomic<int> res2(0);std::jthread t1([&](){x.store(1);res1 = y.load();});std::jthread t2([&](){y.store(1);res2 = x.load();});//*this线程等待其他线程执行完成t1.join();t2.join();std::cout << "res1=" << res1 << std::endl;std::cout << "res2=" << res2 << std::endl;
}

多次运行:

image-20220807144504756

至少有一个值为 1, 表明每个线程都保证了顺序一致性, 但存在交替执行的情况

image-20220807144811635

2. 弱内存模型

使用弱内存模型这些指令会有更多意外的组合, 弱内存模型指令重排只保证单线程的相互依赖的的指令顺序正确

总结:

原子操作默认使用顺序一致性标志

image-20220807150153646

Atomic Flag

std::atomic_flag 是原子布尔类型。不同于所有 std::atomic 的特化,它保证是免锁的。不同于 std::atomic<bool>std::atomic_flag 不提供加载或存储操作。

ATOMIC_FLAG_INIT:定义能以语句 std::atomic_flag v = ATOMIC_FLAG_INIT; 用于初始化 std::atomic_flag 以清除(置 false )状态的初始化器。它能否用于其他初始化语境中是未指定的。

无锁原子

``std::is_always_lock_free`

在不同的平台上原子的实现可能不同, 可以使用std::is_always_lock_free来检查院子是如何实现的

if (std::atomic<T>::is_always_lock_free) assert(std::atomic<T>().is_lock_free();

自旋锁

自旋锁是一种基本的锁,比如互斥锁。

与互斥锁相比,不会等到得到锁。它不断地要求锁进入关键部分。它节省了从用户空间到内核空间的昂贵的上下文切换,但它完全利用CPU并浪费CPU周期。如果线程通常被阻塞短时间,自旋锁是相当有效的。

通常一个锁使用自旋锁和互斥锁的组合。锁首先在一个有限的时间段内使用自旋锁。如果没有成功,则使线程处于等待状态。

class Spinlock
{std::atomic_flag flag = ATOMIC_FLAG_INIT;
public:void lock(){while (flag.test_and_set());}void unlock(){flag.clear();}
};Spinlock spin;void workOnResource()
{spin.lock();spin.unlock();
}int main()
{std::thread t(workOnResource);std::thread t2(workOnResource);t.join();t2.join();
}

condition variable 与 std::atomic<bool>

环境变量

std::vector<int> myShareWork;
std::mutex mutex_;
std::condition_variable condVar;bool dataReady{false};void waitingForWork()
{std::cout << "working" << endl;std::unique_lock<std::mutex> lk(mutex_);condVar.wait(lk, [] { return dataReady; });myShareWork[1] = 2;std::cout << "Work done" << endl;
}void setDataReady()
{myShareWork = {1, 0, 3};{std::lock_guard<std::mutex> lk(mutex_);dataReady = true;}std::cout << "Data prepared" << endl;condVar.notify_one();
}int main(int argc, char* argv[])
{std::cout << std::endl;std::jthread t1(waitingForWork);std::jthread t2(setDataReady);t1.join();t2.join();for (auto v : myShareWork){std::cout << v << " ";}std::cout << "\n\n";
}

###使用std::atomic<bool>实现环境变量

std::vector<int> myShareWork;
std::atomic<bool> dataReady(false);void waitingForWork()
{std::cout << "waiting" << endl;while (!dataReady.load()){std::this_thread::sleep_for(std::chrono::milliseconds(5));}myShareWork[1] = 2;std::cout << "done" << endl;
}void setDataReady()
{myShareWork = {1, 0, 3};dataReady = true;std::cout << "Data prepared" << std::endl;
}int main()
{std::cout << std::endl;std::thread t1(waitingForWork);std::thread t2(setDataReady);t1.join();t2.join();for (auto v : myShareWork){std::cout << v << " ";}std::cout << "\n\n";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

认证考试介绍之RHCE篇

认证考试介绍之RHCE篇 RHCE是Red Hat Certified Engineer的简称&#xff0c;始于1999年3月。截至2001年1月17日&#xff0c;Red Hat的统计资料表明&#xff0c;RHCE资格认证的通过率为62.5%。RHCE是市场上第一个面向Linux的认证考试&#xff0c;它不是一个普通的认证测试&#…

jquery 操作服务端控件,select 控件

<asp:DropDownList ID"ddl" runat"server"></asp:DropDownList> <select id"ddlsel" ></select> jquery取得该控件的方式有&#xff1a; 1. var ddl $("#<%ddl.ClientID%>"); //jq获取服务端控件,此方…

C++ 20 线程安全的Map

C 20 线程安全的Map 粗粒度(锁住整个bucket_data) template <typename Key, typename Value, typename Hash std::hash<Key>> class threadsafe_lookup_table { private:class bucket_type{private:using bucket_value std::pair<Key, Value>;using buck…

毕业多年,我们转变了多少?

懵懂,激情,成熟,沉默.似乎就是每个人的必经之路.从毕业时的酬躇满志到如今的随遇而安,从毕业时的悲伤离别到如今的陌路行人.从毕业时的海枯石烂到如今的两情分别.究竟,我们还有多少没有转变?毕业两年了,才知道,理想再崇高,究竟还是比不过面包.没有理想,大家照样活的滋润.没有面…

IOS设计模式之二(门面模式,装饰器模式)

本文原文请见&#xff1a;http://www.raywenderlich.com/46988/ios-design-patterns.由 krq_tiger&#xff08;http://weibo.com/xmuzyq&#xff09;翻译&#xff0c;如果你发现有什么错误&#xff0c;请与我联系谢谢。门面&#xff08;Facade&#xff09;模式&#xff08;译者…

java实现输出字符串中的数字字符

package com.joe; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { //将字符串的数字字符输出 public static void main(String[] args) { String str "iu7i8hy4jnb2"; //方法一 …

隐私策略 URL

本隐私策略的目的是说明当您访问和使用本插件时我们可能会搜集的资料, 我们会怎样使用这些资料, 是否会透露给第三方, 以及您对这些资料的使用及修改方面的选择权利. 本隐私策略适用于本插件,您需要仔细阅读本隐私策略. 访问者的信息 本插件会保存用户要求保存的信息 插件将…

揭开Vmware 虚拟软件层的秘密

【电脑商网专稿】虚拟软件究竟是什么软件, 是让所有的软件都”虚拟”执行吗, 虚拟软件层究竟是怎样的一层软件? 为什么现在这么多的公司和个人都在使用这种软件, 虚拟软件能代替操作系统完全控制硬件吗? 下面就让我们逐渐的揭开虚拟化技术这一特殊软件层的秘密吧.谈到虚拟化就…

1.使用 Blazor 利用 ASP.NET Core 生成第一个 Web 应用

参考 https://dotnet.microsoft.com/zh-cn/learn/aspnet/blazor-tutorial/create 1.使用vs2022创建新项目 选择 C# -> Windows -> Blzxor Server 应用模板 2.项目名称BlazorApp下一步 3.选择 .NET6.0 或 .NET7.0 或 .NET8.0 创建 4.运行BlazorApp 5.全部选择是。 信…

BROCADE 300和MD3200扩展柜FC SAN,截图

这表示俺玩过&#xff0c;其实&#xff0c;这个光交换机在只有一个共享存储的情况下&#xff0c;可用可不用。 FC BROCADE只是为了方便后期扩展。 FC SAN之类的识别不靠IP&#xff0c;因为不是IP SAN嘛。但也是自己的识别体系。 转载于:https://www.cnblogs.com/aguncn/p/36640…

Java从控制台中读取数据完全攻略

0 引言从控制台中读取数据是一个比较常用的功能&#xff0c;在 JDK 5.0 以前的版本中的实现是比较复杂的&#xff0c;需要手工处理系统的输入流。有意思的是&#xff0c;从 JDK 5.0 版本开始&#xff0c;能从控制台中输入数据的方法每增加一个版本号&#xff0c;就有一种新增的…

总算有点眉目了!

今天打开一个很久没用的邮箱~发现51CTO居然还记得我给我发了封邮件~我也很久没去了&#xff08;基本上注册过后就没去&#xff09;进去看了下~发现变化好大......壮大了。现在我有点激动&#xff0c;总算找到点眉目&#xff0c;在经过了2年的等死阶段&#xff08;偶于2005年学校…

C++ 20 并发编程 std::promise

C 20 并发编程 std::promise std::promise和std::future是一对, 通过它们可以进行更加灵活的任务控制 promise通过函数set_value()传入一个值, 异常, 或者通知, 并异步的获取结果 例子: void product(std::promise<int>&& intPromise, int a, int b) {intPro…

react(87)--批量删除进行置空操作

if (selectedRowKeysList.length 0) {message.error(请选中列表内容);}this.setState({selectedRowKeysList: [],});

女孩儿们的那点秘密

女孩终归是女孩&#xff0c;女孩们总是强迫自己要出得了厅堂入得了厨房有木有&#xff1f;可你们造吗&#xff1f;这对女孩来说可都不容易&#xff01; 你们都以为做饭对女孩来说很简单&#xff0c;可知道我们面对四处乱喷热滚滚的油也会手足无措躲得远远的&#xff1f; 别嫌弃…

求一个正整数是由哪几个连数(连续的正整数)相加

题目描述&#xff1a;随便给出一个正整数&#xff0c; 求出这个数是由哪几个正整数相加&#xff0c;要求相加的这几个数是连续的。 如&#xff1a; 7815&#xff0c;45615&#xff0c;1234515 Test.java: package com.joe; public class Test { public static void main(Str…

CF卡引导IOS惊魂记(二)

接着昨天昨天头比较晕&#xff0c;没有理清思路&#xff0c;今天着重思考几个问题&#xff1a;CF卡的问题&#xff1b;网络为什么不能引导的问题&#xff1b;Flash是否有问题&#xff1b;&#xff08;1&#xff09;CF卡昨天一开始测试时候既然是好的&#xff0c;那么一定是后面…