
协程多线程
文章平均质量分 94
协程原理多线程开发
D_Guco
it互联网/游戏
展开
-
多核时代下线程间的内存可见性
多核时代下线程间的内存可见性原创 2024-08-23 18:05:45 · 603 阅读 · 0 评论 -
libgo源码分析之多线程协程管理和调度
上篇文章libco协程切换原理详解中分析了协程的切换原理,并且也说到了建议用libgo代替libco,因为libgo的协程切换原理是从boost中分离出来的,其实现原理和libco基本上是一样的,不再分析,这里我们主要分析一下libgo多线程协程的管理和调度,因为这一部分libco是没有实现的。首先我们看一段多线程示例。/************************************************ * libgo sample1********************...原创 2020-12-05 20:50:59 · 1360 阅读 · 0 评论 -
libco协程切换原理详解
一 备用知识 之前不止一次的把libco的源码下下来看,但是每次看到协程切换汇编部分都放弃了,大学那点仅有的汇编基础也忘的一干二净,更不堪的是百度搜到的libco相关文章也看不懂,最近决定静下心来看一些相关的东西,终于像啃骨头一样把这块东西搞明白了。在网下阅读之前请先务必看懂下面的内容。第一部分 汇编基础 1 CSAPP阅读笔记-汇编语言初探(数据传送类指令):CSAPP阅读笔记-汇编语言初探(数据传送类指令) 2 CSAPP阅读笔记-汇编语言初探(算术和逻辑操作类指令)...原创 2020-11-14 01:04:30 · 2175 阅读 · 2 评论 -
mutex如何保证数据的一致性和正确性
一 mutex如何保证数据的一致性和正确性 最近突然关于mutex有一个疑问,当我们在开发多线程程序的时候第一个想到的就是用mutex来保护我们的多线程共享变量,保证数据的一致性和正确性,那mutex到底是如何保证的呢? 1 原子访问:避免线程在访问数据对象时,另一线程正在修改它 2 内存可见性:一旦线程修改数据对象,其它线程在修改行为发生之后马上能看见此对象的最新新状态 对于第一点是我之前一直熟知的mutex具有的功能,对于第二点虽然之前了解过关于内存可见性相关的知识但是没...原创 2020-11-07 11:33:04 · 1077 阅读 · 0 评论 -
单线程读单线程写一个变量是否一定要加锁
单线程读单线程写一个变量是否需要加锁,刚毕业的时候我会有这样的想法:一个线程只读并没有改变变量的值并不会有两个线程同时写一个变量产生竞态,所以不用加锁,但是工作中长者给我指导都是多线程必须加锁,所以我也没有深究这个问题,从来没有想过为什么。 过了一段时间后,了解到原子性这个概念,了解到虽然一个线程读一个线程写,但是因为对一个线程的写和读并非是原子的,读线程可能读到另外一个线程写到一半的值...原创 2019-08-25 21:50:21 · 10160 阅读 · 3 评论 -
C++内存模型和原子类型操作
c++ memory order 内存序原创 2019-03-10 14:02:24 · 1002 阅读 · 0 评论 -
揭开内存屏障的面纱
推荐阅读(强烈推荐)c++标准库内存屏障的使用一 什么是内存屏障 内存屏障(英语:Memory barrier),也称内存栅栏,内存栅障,屏障指令等,是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。 每个CPU都会有自己的缓存(有的甚至L1,L2,L3),缓存的目的就是为了提高性...原创 2019-01-30 19:16:37 · 3421 阅读 · 0 评论 -
c++ 线程局部变量thread_local
c++11 中添加了新的关键字thread_local,用来声明新的存储期(线程存储期变量),即线程局部变量。 存储类指定符是名称声明语法的 decl-specifier-seq 的一部分。与名称的作用域一同,它们控制名称的二个独立属性:其“存储期”与其“链接”。auto - 自动存储期(C++11 起)。register - 自动存储期。亦提示编译器将此对象置于处理器的寄存器。C...原创 2019-01-20 17:25:38 · 10115 阅读 · 0 评论 -
linux spin_lock(自旋锁)semaphore(信号量)和mutex(互斥锁)的区别
1 spin_lock 自旋锁的实现是为了保护一段短小的临界区操作代码,保证这个临界区的操作是原子的,从而避免并发的竞争冒险。在Linux内核中,自旋锁通常用于包含内核数据结构的操作,你可以看到在许多内核数据结构中都嵌入有spinlock,这些大部分就是用于保证它自身被操作的原子性,在操作这样的结构体时都经历这样的过程:上锁-操作-解锁。 如果内核控制路径发现自旋锁“...原创 2019-01-13 22:03:32 · 3720 阅读 · 0 评论 -
shared_ptr的线程安全性
shared_ptr的出现在某种程度上解放了c++程序员,c++11标准原生的支持了并发编程,在并发编程中shared_ptr的线程安全问题如何保证呢?先撇开shared_ptr对象的线程安全性,先看shared_ptr本身的线程安全问题。 我们知道,shared_ptr的底层实现原理是引用计数,关于这个计数是否线程安全呢,如果我们把shared_ptr分别传递到不同的线程中,是否会...原创 2018-05-01 17:47:06 · 10260 阅读 · 0 评论 -
线程安全的对象生命周期管理
首先有关线程安全的定义:1 多线程同时访问保证其逻辑正确性2 在多线程同时运行时,保证线程执行顺序的正确性3 调用该部分代码时,不需要额外的同步操作,从这些方面可以判断出标准库中如vector,list,map等都是非线程安全的。 使用同步原语保证类的内部状态实现类的线程安全并不是难事,但是对象的创建和销毁不能由对象自身的锁来保证,如何避免在对象析构时可能的死锁呢?首先在对象原创 2017-11-04 18:12:19 · 1372 阅读 · 0 评论 -
唤醒线程是否要持有锁(Signal With Mutex Locked Or Not?)
我们经常需要通过某种条件去唤醒和阻塞一个线程,我们唤醒线程时是否需要继续持有锁呢,换句话说我们是先释放锁再唤醒还是先唤醒再释放锁呢? pthread_mutex_lock(&mutex);predicate=true;pthread_cond_signal(&cv); // OR: pthread_mutex_unlock(&mutex);pthread_mutex_un原创 2017-10-22 11:41:55 · 3621 阅读 · 1 评论 -
atomic和volatile的操作的原子性
c++11提供了atomic来实现无锁并发数据结构,用起来很简单。 #include #include #include #include using namespace std;//std::mutex mu_lock;//int num = 0;std::atomic num(0);void testThread1(){ for ...原创 2017-07-09 16:49:47 · 7035 阅读 · 0 评论 -
伪共享的产生原因和优化方案
一 flase sharing产生原因 在谈到false sharing问题之前我们先说cpu缓存的问题。 CPU 缓存(Cache Memory)是位于 CPU 与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解决 CPU 运算速度与内存读写速度不匹配的矛盾,因为 CPU 运算速度要比内存读写速度快很多,这样会使 CPU...原创 2017-06-17 19:53:23 · 2543 阅读 · 0 评论 -
c++11 多线程基础
在c++11中,c++标准库中就增加了关于多线程的一些操作,在此之前我们不得不调用系统底层的多线程函数,或者用第三方的线程库,多少还是有些不便,现在我们可以用标准库中的多线程函数来开发多线程程序了。下面就介绍一下基本的用法。#include #include void thread_test(int a,int b){ std::cout << "thread_test:a +原创 2017-06-04 16:37:23 · 874 阅读 · 0 评论 -
c++11异步编程
c++11异步编程原创 2017-04-23 17:26:14 · 10458 阅读 · 0 评论 -
cpu cache的魔法
首先简单了解一下什么是cpu cache这里推荐一篇文章吧,说的很详细。 关于cpu cache:点击打开链接 接下来我们看一些程序片段。#include #include #include int flag = 1;pthread_mutex_t lock;void* my_thread(void *){ sleep(1); ...原创 2017-03-01 11:09:10 · 1317 阅读 · 3 评论 -
如何写出线程安全的类和函数
如何写出线程安全的类和函数原创 2017-02-23 21:56:37 · 2531 阅读 · 0 评论 -
多进程/线程的取和舍
多线程是我们在开发中必须掌握的一个开发技能,多线程可以充分发挥cpu多核的特性,充分利用cpu多核的优势,让我们的程序更快的运行,但是在实际开发过程中(注:我只工作了一年多的时间,主要做游戏开发,但是我看过几个大型的游戏的服务源码)多线程并不经常使用,只是在很少的地方使用了多线程去开发。为什么很多人排斥多线程呢。 从给我目前的经验来看(一年多经验,望大神补充和修正)多线程虽然有他的优点,原创 2017-01-16 22:38:44 · 867 阅读 · 0 评论