首页 / 知识
关于多线程:C ++是否读写int原子?
2023-04-14 20:03:00

Are C++ Reads and Writes of an int Atomic?我有两个线程,一个线程更新一个int,另一个读取它。 这是一个统计值,其中读取和写入的顺序无关紧要。 我的问题是,是否仍然需要同步对此多字节值的访问? 或者,换一种说法,可以完成部分写入并使其中断,然后进行读取。 例如,考虑一个值为0x0000FFFF的值,该值的增量值为0x00010000。 有一段时间我应该担心该值看起来像0x0001FFFF吗? 当然,类型越大,越可能发生这种情况。 我一直同步这些类型的访问,但很好奇社区的想法。 男孩,什么问题。答案是:
一切都取决于系统的体系结构。在IA32上,正确对齐的地址将是原子操作。未对齐的写入可能是原子的,这取决于所使用的缓存系统。如果内存位于单个L1高速缓存行中,则它是原子的,否则就不是原子的。 CPU和RAM之间的总线宽度会影响原子性质:在8086上正确对齐的16位写入是原子的,而在8088上进行相同的写入则不是,因为8088仅具有8位总线,而8086却具有8位总线。 16位总线。 另外,如果您使用的是C / C ++,请不要忘记将共享值标记为volatile,否则优化程序将认为该变量永远不会在您的线程之一中更新。 最初,人们可能会认为对本机机器大小的读取和写入是原子的,但是要处理许多问题,包括处理器/内核之间的缓存一致性。在Windows上使用原子操作,例如Interlocked *,在Linux上使用等效操作。 C ++ 0x将具有一个"原子"模板,以将它们包装在一个不错的跨平台界面中。现在,如果您正在使用平台抽象层,它可能会提供这些功能。 ACE可以,请参见类模板ACE_Atomic_Op。 如果您正在读取/写入4字节的值,并且它在内存中是DWORD对齐的,并且您正在I32体系结构上运行,则读写是原子的。 是的,您需要同步访问。在C ++ 0x中,它将是一场数据竞赛,并且是未定义的行为。使用POSIX线程,它已经是不确定的行为。 实际上,如果数据类型大于本机字大小,则可能会得到错误的值。另外,由于优化会移动读取和/或写入,另一个线程可能永远看不到写入的值。 在Windows上,Interlocked *** Exchange *** Add被保证是原子的。 您必须同步,但是在某些体系结构上,有进行同步的有效方法。 最好是使用子例程(可能在宏后面隐藏),以便您可以有条件地将实现替换为特定于平台的实现。 Linux内核已经有一些这样的代码。 为了回应大家在楼上所说的话,C ++ 0x之前的语言无法保证有关从多个线程访问共享内存的任何信息。任何保证都取决于编译器。
绝对不行! 有人认为++ c是原子的,但是关注生成的程序集。例如,'gcc -S':
要增加一个int,编译器首先将其加载到寄存器中,然后将其存储回内存中。这不是原子的。
tc 让我们举个例子
假定第一条语句是原子的,因为它会转换为占用一个CPU周期的单个INC汇编指令。但是,第二个分配需要几个操作,因此显然不是原子操作。 另一个例如
同样,您必须分解代码以查看此处实际发生的情况。 除了上面提到的缓存问题... 如果将代码移植到具有较小寄存器大小的处理器,它将不再是原子的。 IMO,线程问题太棘手,无法冒险。 我同意很多人,尤其是杰森。在Windows上,可能会使用InterlockedAdd及其朋友。 不,它们不是(或者至少您不能认为它们是)。话虽如此,有一些技巧可以自动完成,但是它们通常是不可移植的(请参阅"比较并交换")。 唯一可移植的方法是为编译器使用signal.h标头中定义的sig_atomic_t类型。在大多数C和C ++实现中,这是一个整数。然后将变量声明为" volatile sig_atomic_t"。 |
最新内容
相关内容
linux线程查询命令?
linux线程查询命令?,系统,第一,线程,命令,软件,名称,信息,进程,选项,方法,Linux系统如何查看进程的线程数1、第一种方法:top命令法首先执行toplinux读取码值命令?
linux读取码值命令?,系统,工作,地址,证书,命令,工具,档案,文件,设计,信息,基本linux命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出目linux多线程下载命令?
linux多线程下载命令?,软件,工具,平台,中心,系统,代理,网络,网站,手机,官方网站,从linux服务器中下载或上传文件wget是linux下一个从网络上自linux断开线程命令?
linux断开线程命令?,系统,状态,工作,代码,线程,入口,网络,管理,名称,命令,linux下C中怎么让才能安全关闭线程方法:在线程入口函数中,调用returnlinux查看读写命令?
linux查看读写命令?,系统,电脑,数字,状态,命令,工作,设备,材料,工具,文件,linux查看文件权限?1、打开linux系统,在linux的桌面的空白处右击。在linux统计行数命令?
linux统计行数命令?,情况,系统,地址,总量,单位,信息,命令,文件,内存,接下来,LINUX查看文件总行数和指定行wc命令:统计指定文件中的字节数、字数linux下读写文件命令?
linux下读写文件命令?,工作,系统,电脑,标准,地址,命令,文件,时间,环境,信息,linux命令大全:查看文件内容1、列出文件清单命令,ls。ls命令能够列linux停止线程的命令?
linux停止线程的命令?,系统,软件,代码,产品,进程,第一,管理,生产,通信,工具,linux下nginx停止命令1、首先,连接相应linux主机,进入到linux命令行linux超线程查看命令?
linux超线程查看命令?,系统,第一,信息,软件,命令,数据,工具,实时,界面,个数,Linux查看CPU详细信息这里我先介绍一个文件。它就是/proc目录文件linux查看多线程命令?
linux查看多线程命令?,系统,第一,线程,地址,数据,进程,命令,名称,软件,情况,如何查看linux服务器的cpu数量,内核数,和cpu线程数如何查看linuxlinux执行线程命令?
linux执行线程命令?,系统,工作,线程,软件,服务,管理,信息,环境,名称,命令,linux下线程属性常用操作有哪些1、linux系统常用操作命令linux系统linux命令统计io数?
linux命令统计io数?,系统,情况,网络,状态,数据,工具,命令,信息,环境,电脑,如何找出Linux系统高IO的思路总结1、使用iotop命令使用该命令有个条