首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C 语言的 互斥、自旋、原子操作

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金 今天不整 GO 语言,我们来分享一下以前写的 C 代码,来看看 互斥,自旋和原子操作的 demo 互斥 临界区资源已经被1个线程占用...,另一个线程过来访问临界资源的时候,会被CPU切换线程,不让运行后来的这个线程 适用于 锁住的内容多,(例如红黑数的增加节点操作),切换线程的代价小于等待的代价 自旋 临界区资源已经被1个线程占用,...需求场景: 1、用10个线程分别对 count 加 100000 次, 看看结果是否是 10*100000 main 函数中创建 10 个线程 线程函数中调用 inc 做数据的增加 分别使用 互斥,...//并发 //互斥mutex // 如果获取不到资源会让出cpu // 使用场景 // 共享区域执行的内容较多的情况 //自旋spinlock // 如果获取不到资源,会原地自旋,忙等 // 使用场景...自旋,原子操作,数据都能如我所愿的累加正确,在时间上面他们还是有一定的差异: 自旋 和 互斥 在此处的案例性能差不多,但是原子操作相对就快了很多 欢迎点赞,关注,收藏 朋友们,你的支持和鼓励,是我坚持分享

1.2K20

c语言编程,无编程与有编程的效率总结、无队列的实现(c语言)「建议收藏」

1.无编程与有编程的效率 无编程,即通过CAS原子操作去控制线程的同步。如果你还不知道什么使CAS原子操作,建议先去查看相关资料,这一方面的资料网络上有很多。...CAS实现的是硬件级的互斥,在线程低并发的情况下,其性能比普通互斥高效,但是当线程高并发的时候,硬件级互斥引入的代价与应用层的竞争产生的代价同样都是很大的。这时普通编程其实是优于无编程的。...如果对有多线程程序有良好的设计,那么可以使程序的性能在不下降的同时,实现高并发。...2.无编程的好处 无编程不需要程序员再去考虑死锁、优先反转等棘手的问题,因此在对应用程序不太复杂,而对性能要求稍高的程序中,可以采取有编程。...如果程序较为复杂,性能要求不高的程序中可以使用无编程。 3.无队列的实现 对于线程无同步方式方式的应用,我实现了一个无的队列。

1.5K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    信号量、互斥、自旋、原子操作

    linux内核中有多种内核,内核的作用是: 多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是可以访问所有内核数据的,因此要对共享数据进行保护,即互斥处理; linux内核机制有信号量...也就是说信号量通过PV操作同步解决了进程/线程对临界资源利用的冲突问题; 二、互斥:(mutex_lock) 互斥同样也是对线程间(不能对进程)同步和互斥的一种另一种机制。...CPU上有一根引线#HLOCK pin连到北桥,如果汇编语言的程序中在一条指令前面加上前缀"LOCK",经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开...: 1、信号量一般以同步的方式对共享资源进行控制,而互斥通过互斥的方式对共享资源对其进行控制; 2、信号量可以对进程的共享资源进行控制,而互斥不行; 3、信号量的值为非负整数,而互斥的值只能为0或...1; 4、互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到; 自旋与互斥的区别: 1、因为自旋不会引起调用者睡眠,所以效率比较高 2、自旋比较适用于使用者保持时间比较短的情况

    3.1K40

    C语言模拟QT的信号与槽功能

    既然信号槽如此好用,嵌入式开发也想拥有,下边就开始用C语言一步步实现它吧... ---- Part2一、Qt信号与槽的实现机理 在Qt中实现信号与槽最重要的就是通过元对象系统(MOS)的元对象编译器(MOC...QT Creator官方帮助文档对信号槽使用方法做了详细的介绍,接下来我们就依照官方的使用方法,依葫芦画瓢,用C语言的宏模拟出山寨版的信号和槽。 Part3二、简化后的实现步骤 11....实现声明信号的宏 QT中定义信号是在类中使用signals声明一个函数,不需要自己实现信号函数,在生成的moc文件中,代替你实现了你声明的信号函数,所以发射信号的本质就是通过调用信号函数,再调用槽函数。...这个时候,如果看过上篇文章C语言变参函数和可变参数宏,应该就能立马想到我们其实已经实现了一个可以获得可变参数宏中参数数量的宏了:#define VA_NUM_ARGS(...)...玩信号与槽,少不了要与面向对象打交道,众所周知,C语言不是面向对象的语言,对于面向对象的特性不是很友好,不过不用担心,福利来了,裸机思维公众号作者开源了一套面向对象的C语言框架,可以轻松助你在C语言中零代价的愉快玩耍面向对象

    2.1K30

    C++ 语言】pthread_mutex_t 互斥

    文章目录 线程同步机制 互斥 互斥使用示例 线程同步机制 ---- 线程同步机制引入 : 多个线程读取同一个资源时 , 可能会造成冲突 , 因此需要引入线程同步机制 , 让多个线程按照一定规则对共享的资源进行操作...; 互斥 ---- 互斥使用流程 : ① 声明互斥 , ② 初始化互斥 , ③ 加锁 , ④ 解锁 , ⑤ 销毁互斥 ; ① 声明互斥 ; pthread_mutex_t mutex_t;...② 初始化互斥 : //初始化互斥 pthread_mutex_init(&mutex_t, 0); ③ 加锁 : //先用互斥锁上锁 pthread_mutex_lock(&mutex_t...); ④ 解锁 : //操作完毕后, 解锁 pthread_mutex_unlock(&mutex_t); ⑤ 销毁互斥 : //销毁互斥 pthread_mutex_destroy(&mutex_t...namespace std; /* 互斥 : 声明 : 先声明互斥 初始化 : 在进行初始化操作 销毁 : 使用完毕后 , 要将该互斥销毁 */ pthread_mutex_t

    73730

    临界区、信号量、互斥、自旋与原子操作

    临界区、信号量、互斥、自旋与原子操作 临界区 程序想要使用共享资源,必然通过一些指令去访问这些资源,若多个任务都访问同一资源,那么访问该资源的指令代码组成的区域称临界区。...简而言之,临界区是代码 信号信号量简单的说是一种计数器,用P/V操作表示减和增。...增加操作包括两个微操作: 增加: 将信号量的值加一 唤醒此信号量上等待的线程 减少: 判断信号量的值是否大于0 如果值大于0,则将信号量减1 若果信号量等于0,则当前线程将自己阻塞 信号量的值代表资源剩余量...,我们可以用二元信号量实现。...CPU上有一根引线#HLOCK pin连到北桥,如果汇编语言的程序中在一条指令前面加上前缀”LOCK”,经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开

    1.7K10

    Linux内核中的各种信号量互斥读写原子自旋内存屏障等

    二、信号量/互斥 — —临界区 信号量: 信号量(信号灯)本质是一个计数器,是描述临界区中可用资源数目的计数器。 信号量为3,表示可用资源为3。...信号量进行多线程通信编程的时候,往往初始化信号量为0,然后用两个函数做线程间同步: sem_wait():等待信号量,如果信号量的值大于0,将信号量的值减1,立即返回。...; }; 互斥信号量的话表示可用资源的数量,是允许多个进程/线程在临界区的。..._asm__ __volatile__("" ::: "memory"); y = 1; } 或者将涉及到的相关变量x和y用volatile关键字修饰: volatile int x, y; 注意,C+...对于应用层的编程而言,C++11引入了内存模型,它确保了多线程程序中的同步和一致性。

    1.4K10

    详解Linux多线程中互斥、读写、自旋、条件变量、信号

    如果条件为假,线程自动阻塞,并释放等待状态改变的互斥。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程。...信号量用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。...编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于0时,则可以访问,否则将阻塞 #include // 初始化信号量 int sem_init(...(sem_t *sem, int *sval); // 销毁信号量 int sem_destroy(sem_t *sem); 示例 // 信号量用于同步实例 #include #...void *arg) //此线程打印字符的值 { while(1) { sem_wait(&sem_p); printf("%c"

    3.5K20

    Go语言互斥和读写

    一、互斥 Go语言中多个协程操作一个变量时会出现冲突的问题 go run -race 可以查看竞争 可以使用sync.Mutex对内容加锁 互斥的使用场景 多个goroutine访问同一个函数(代码段...) 这个函数操作一个全局变量 为了保证共享变量安全性,值合法性 使用互斥模拟售票窗口 package main import ( "fmt" "sync" "time" "math...readerCount int32 // number of pending readers readerWait int32 // number of departing readers } Go语言标准库中...RWMutex) RLock()//禁止其他协程写入,只能读取 func (rw *RWMutex) RUnlock() func (rw *RWMutex) RLocker() Locke Go语言中的...RWMutex可以添加多个读或一个写.读写不能同时存在. map在并发下读写就需要结合读写完成 互斥表示的代码同一时间只能有一个人goroutine运行,而读写表示在范围内数据的读写操作

    72530

    信号量,和 golang 相关源码分析

    本文为社区粉丝原创投稿,再次感谢作者南瓜waniu的分享,欢迎大家在评论区留言和作者讨论,同时也欢迎大家踊跃投稿,分享您的golang语言学习经验!...投稿邮箱地址为tougao@golang.ltd 原创投稿:南瓜waniu 1资源同步 1.1 解决方案 2 信号量 2.1 共享变量 2.2 信号量 3 3.1 死锁 3.2 活 3.3 饥饿...变量几乎每一个编程语言都提供了资源同步方式:机制。该机制通过对资源进行Lock和Unlock,以达到对关键资源有序访问。 严格轮换法线程不停的执行CPU时间,连续测试某一个值是否出现。...但是如果认为等待的时间非常短,可以使用该方式浪费CPU时间,用于等待的也成为自旋。 2 信号量 2.1 共享变量 在理解信号量之前,先了解采用共享变量使用多线程会出现什么问题。...在go语言的互斥中采用结合上述两种策略,接下来小节中,将会仔细分析源码。

    1.7K30

    C#的

    C#提供了多种机制来同步线程间的访问,以防止数据竞争和其他并发问题。本文将深入探讨C#中的,包括它们的基本概念、实现方式、高级用法和最佳实践。1....的基本概念1.1 什么是是一种同步机制,用于控制多个线程对共享资源的访问。当一个线程访问某个资源时,它会锁定该资源,其他线程必须等待释放后才能访问。...实现2.1 使用lock关键字lock关键字是C#中最基本的机制,它确保一个代码块一次只能由一个线程执行。...的高级特性3.1 可重入可重入允许同一个线程多次获取。...的最佳实践4.1 的粒度选择适当的粒度,避免锁定整个方法或类,而是锁定最小的资源。4.2 避免长持有时间尽量减少持有的时间,以减少等待时间并提高性能。

    81200

    一文看懂临界区、互斥、同步、临界区、信号量、自旋等名词!

    这还别说一门语言一堆名词。其实有些名词叫法不同,实际上就是一个意思。 A 语言有这个名词,B 语言就起另外一个名词。不能大胆的雷同,所以就改变一个叫法,其本质还是一样的。...为了减少大家在私信我,那我今天就来扯一扯,竞态条件,竞态资源,轮询忙等,变量,原子性,TSL,阻塞,睡眠,唤醒,管程,互斥,同步,临界区,互斥量,信号量,自旋等各个专业名词的实际所代表的含义。...互斥量:使用sleep和wakeup原语,保证同一时刻只有一个线程进入临界区代码片段的叫“互斥量”。 信号量:把互斥推广到"N"的空间,同时允许有N个线程进入临界区的叫“信号量”。...互斥量和信号量的实现都依赖TSL指令保证“检查-占”动作的原子性。...管程:把互斥量交给程序员使用太危险,有些编程语言实现了“管程”的特性,从编译器的层面保证了临界区的互斥,比如Java的synchronized关键字。

    5.7K20

    C++11 信号槽 signalslot

    参考链接: C++ signal() 最近在看陈硕大大 的《Linux 多线程服务端编程:使用 muduo C++ 网络库》  ,看到里面用variadic template 和boost智能指针 实现了一个...就想利用纯C++11 实现一遍。 ...二、copyonwrite代替读写。  基本思想就是如果此刻有其他线程正在进行读操作,那么写操作需要在新的副本上执行。 ...那么我们分析一下,若在写操作时有其他线程要进行读操作会等待释放;而没有写操作时可以有很多读操作,在进入和退出读操作的过程中他们的引用计数分别加1、减1,从而保证了读操作时内存的确定以及读操作完成后内存的释放...wp(wadk_ptr的简称)是槽感知信号生命的指针,在信号中的vector>则可以感知每个槽的生命。能感受到对方的生命,就可以执行相应操作。

    1.4K20
    领券