
C++多线程
文章平均质量分 53
C++多线程编程
s.feng
计算机视觉,C++
展开
-
信号量和互斥锁的区别
使用说明如果涉及到多线程对同一个资源进行访问,比如一个全局变量,那么就使用mutex如果涉及到多个线程同步问题就用信号量semaphore,比如利用多线程做一个简单的数列加法解释很多人闹不清楚互斥锁和信号量的区别,觉得二者都是对资源加锁的操作,其实二者真正的区别是互斥量是实现一个原子操作,也就是避免不同线程同时访问一个共享资源,导致出现异常;而信号量则是为了线程同步所设计的。例子mutexmutex mtx;void add(int& i) { mtx.lock();原创 2020-09-11 12:48:05 · 3200 阅读 · 1 评论 -
多线程中的一些概念
可以理解为一个通行令牌,当有一个线程A拿到后,其他线程只有等待,等到A通行结束后,会把令牌归还,其余线程自己去抢。c++20之前是没有这个玩意的,下面可以用互斥量和条件变量去是现实一个。和二元信号量的区别是,互斥量是线程A获取,必须A去释放,而二元信号量是进程里所有的其他线程都可以去抢夺释放。这里使用场景是一定可以保证函数B先执行,所以可以看出二元信号量可以用作线程之间通信或者同步使用。可以理解为多个通行令牌,理解和上面一样,无非是一次可以有多个线程通行。原创 2024-10-11 14:26:27 · 271 阅读 · 0 评论 -
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 · 391 阅读 · 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 · 199 阅读 · 0 评论 -
C++ memory order问题
【代码】C++ memory order问题。原创 2023-07-27 16:53:50 · 257 阅读 · 0 评论 -
5.多线程中的内存模型
这个名词就很奇怪,它不是说对象的内存布局,而是在说多线程编程问题,这个问题真是孩子没娘,说来话长。首先是硬件上的,由于计算单元做计算的速度很快,但是每次从内存上去数据速度很慢,为此搞了一缓存的硬件,从缓冲上去数据速度很快。可以看到下面这款cpu有L1/L2/L3三款缓存,此外还有Store Buffer (SB),且SB和L1 是每个Core独享,而L2是两个Core共享,L3是所有Core共享。为了提高性能,在实际运行中,不管是编译器还是硬件cpu都会重排我们的代码逻辑,既然编译器和cpu都会重排,原创 2022-10-12 13:39:35 · 306 阅读 · 0 评论 -
4.线程之间的同步
线程同步原创 2022-10-10 19:16:50 · 117 阅读 · 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 · 244 阅读 · 0 评论 -
2. 线程管控
本节来讨论线程的一些基本管控,比如啥时候启动,啥时候关闭。原创 2022-09-30 15:26:47 · 755 阅读 · 0 评论 -
1. C++并发世界
在C++11的标准中开始支持多线程,也就是2011年后C++语言在原生层面开始接纳多线程应用。在之前,Linux/Unix平台下的开发者通常会使用POSIX Threads,Windows上的开发者也会有相应的接口。但很明显,这些API都只针对特定的操作系统平台,可移植性较差。如果要同时支持Linux和Windows系统,你可能要写两套代码。目前虽然有了标准,但是有些情况还是不可能达到性能要求,这个时候就需要利用平台专属的工具,一般会一共一个native_handle()函数,这里不做详细阐述。原创 2022-09-30 13:02:54 · 377 阅读 · 0 评论