C++多线程
文章平均质量分 53
C++多线程编程
s.feng
计算机视觉,C++
展开
-
6、C++内存模型
assert是仍然有可能触发的!內存模型是std::memory_order_relaxed, 根据这个内存模型的说明,1,2处可能乱序,5,6和7也可能重拍乱序。C++11开始支持多线程,其中提供了原子类型atomic, 和atomic关系比较密切的是memory_order,所有的内存模型都是指atomic类型。保证了读写的完整性(不会读取到写一半的数据,要么是新值,要么是旧值),而且要求单个线程内的同样一个原子变量的各种操作顺序不能进行重排。原创 2023-07-28 10:26:35 · 296 阅读 · 0 评论 -
C++ memory order 可见性概念
根据上面示例可以猜测,所谓的可见就是,一旦线程1遇到走到memory_order_acquire(flag_is_init)时候,假如flag_is_init是true,那么可以保证线程0在memory_order_release(flag_is_init = true)之前的代码100%是执行了。假如flag_is_init 还不是true的话,那么thread1也就可以确定thead0至少还没执行到memory_order_release这一行代码,init()可能执行了也可能没有执行。原创 2023-07-27 17:50:54 · 115 阅读 · 0 评论 -
C++ memory order问题
【代码】C++ memory order问题。原创 2023-07-27 16:53:50 · 191 阅读 · 0 评论 -
5.多线程中的内存模型
这个名词就很奇怪,它不是说对象的内存布局,而是在说多线程编程问题,这个问题真是孩子没娘,说来话长。首先是硬件上的,由于计算单元做计算的速度很快,但是每次从内存上去数据速度很慢,为此搞了一缓存的硬件,从缓冲上去数据速度很快。可以看到下面这款cpu有L1/L2/L3三款缓存,此外还有Store Buffer (SB),且SB和L1 是每个Core独享,而L2是两个Core共享,L3是所有Core共享。为了提高性能,在实际运行中,不管是编译器还是硬件cpu都会重排我们的代码逻辑,既然编译器和cpu都会重排,原创 2022-10-12 13:39:35 · 237 阅读 · 0 评论 -
4.线程之间的同步
线程同步原创 2022-10-10 19:16:50 · 81 阅读 · 0 评论 -
3.线程间共享数据
比如一个stack对象obj,当线程1在调用obj.size()的时候,线程2在执行obj.pop()函数,虽然每个函数都加锁,比如线程1在方向size=1,接下来做pop操作时候,线程2已经把数据pop出去了,这样一来就会报错,所以在设计多线程时候还是要想清楚。可以看到,当我们在用电脑时候,要鼠标和键盘一起使用,这里有个问题,就是线程1是先抢键盘,而线程2是先抢鼠标,这样两个线程就会出现死锁现象。解决方法是线程1和2都是先抢键盘再抢鼠标,或者同时锁住(C++提供了std::lock()函数)。原创 2022-10-10 00:46:08 · 194 阅读 · 0 评论 -
2. 线程管控
本节来讨论线程的一些基本管控,比如啥时候启动,啥时候关闭。原创 2022-09-30 15:26:47 · 606 阅读 · 0 评论 -
1. C++并发世界
在C++11的标准中开始支持多线程,也就是2011年后C++语言在原生层面开始接纳多线程应用。在之前,Linux/Unix平台下的开发者通常会使用POSIX Threads,Windows上的开发者也会有相应的接口。但很明显,这些API都只针对特定的操作系统平台,可移植性较差。如果要同时支持Linux和Windows系统,你可能要写两套代码。目前虽然有了标准,但是有些情况还是不可能达到性能要求,这个时候就需要利用平台专属的工具,一般会一共一个native_handle()函数,这里不做详细阐述。原创 2022-09-30 13:02:54 · 320 阅读 · 0 评论