C++ 20 内存模型(一)

C++ 20 内存模型(一)

多线程的基础是优秀的内存模型

C++20 内存模型:

  • 高复杂性, 难以理解
  • 对多线程有更深入的理解

内存布局

位域

member_name成员名, width bit 宽度

struct bit_field_name
{type member_name : width;
};
struct my_struct
{char a;int b : 5; // 最大存储 2^5 ,只使用低五位节约空间...int c : 11,: 0,d : 8;int e;double f;string g;
};

位域的对齐

不允许跨越 uint 大小的区域

struct my_struct2
{char a;int c : 30;int b : 5;
};

c: 30 bit + 空2 bit + b 5 bit

例子:

#include <iostream>
#include <thread>
using namespace std;struct my_struct
{char a;int b : 5;int c : 11,: 0,d : 8;int e;double f;string g;
};int main(int argc, char* argv[])
{my_struct s{.a = 'a',.b = 1,.c = 2,.d = 3,.e = 4,.f = 5.0,.g = "hello"};cout << &s << endl;cout << "sizeof(my_struct) = " << sizeof(my_struct) << endl;
}

使用内存查看工具查看内存

**这种方式可以解决内存伪共享问题: **

来举一个java多线程的例子

class MyObject
{
private long a;
private long b;
private long c;
}

按照Java规范,MyObject的对象是在堆内存上分配空间存储的,而且a、b、c三个属性在内存空间上是近邻,如下所示。

a(8个字节) b(8个字节) c(8个字节)

我们知道,X86的CPU中Cache Line的长度为64字节,这也就意味着MyObject的3个属性(长度之和为24字节)是完全可能加载在一个Cache Line里的。如此一来,如果我们有两个不同的线程(分别运行在两个CPU上)分别同时独立修改a与b这两个属性,那么这两个CPU上的Cache Line可能出现如下所示的情况,即a与b这两个变量被放入同一个Cache Line里,并且被两个不同的CPU共享。
img

根据MESI协议的相关知识,我们知道,如果Thread 0要对a变量进行修改,则因为CPU 1上有对应的Cache Line,这会导致CPU 1的Cache Line无效,从而使得Thread 1被迫重新从Memory里获取b的内容(b并没有被其他CPU改变,这样做是因为b与a在一个Cache Line里)。同样,如果Thread 1要对b变量进行修改,则同样导致Thread 0的Cache Line失效,不得不重新从Memory里加载a。如此一来,本来是逻辑上无关的两个线程,完全可以在两个不同的CPU上同时执行,但阴差阳错地共享了同一个Cache Line并相互抢占资源,导致并行成为串行,大大降低了系统的并发性,这就是所谓的Cache伪共享。

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

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

相关文章

char[]:strlen和sizeof的区别

C code: // char[]&#xff1a;strlen和sizeof的区别#include <stdio.h>#include <string.h>int main(int argc, char* argv[]){char str[] "Hello man";printf("str %s\nstrlen(str) %d\nsizeof(str) %d\n", str, strlen(str), sizeof(st…

讲话的技巧

名人的精神讲话&#xff08;有话则短&#xff0c;无话则免&#xff09;有人问美国第28任总统伍德罗.威尔逊,他准备一份10分钟的讲稿,得花多少时间?威尔逊答&#xff1a;“两星期。”“准备一份1小时的讲稿呢&#xff1f;”“一星期。”“两个小时的讲稿&#xff1f;”“不用准…

sql-C#-类型对应

bitbooltinyintbytesmallintshortintintbigintlongrealfloatfloatdoublemoneydecimaldatetimeDateTimecharstringvarcharstringncharstringnvarcharstringtextstringntextstringimagebyte[]binarybyte[]uniqueidentifierGuid/ SqlDbType转换为C#数据类型 public static Type Sq…

关于局部变量在内存中的地址

C code: #include<stdio.h> void main(){ int aa 11, bb 22; int a 1; int b 2; printf("%X/t%X/t%X/t%X/n", &aa, &bb, &a, &b);} Running Result: 12FF7C 12FF78 12FF74 12FF70 可见局部变量是存放在栈区的&#xff0c;他们的地址先…

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

C20 Atomic 原子 内存模型(二) 原子是C内存模型的基础 强/弱内存模型 1. 强内存模型 Leslie Lamport 定义了顺序一致性的概念 顺序一致性提供两个保证: 指令按源码的顺序执行对所有线程的所有指令有全局的顺序 以上不仅仅作用于原子, 也影响着非原子变量 int main(int a…

认证考试介绍之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;就有一种新增的…