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

C++ 多线程 ——

c11开始,c提供了std::mutex类型,对于多线程的加锁操作提供了很好的支持。 线程之间的有: 互斥、条件、自旋、读写、递归。一般而言,的功能与性能成反比。...() 来解锁不过一般不推荐这种做法,标准C库提供了 std::lock_guard 和 unique_lock 类模板,都是 RAII 风格,它们是在定义时获得,在析构时释放。...简单的来说:当调用构造函数时,会自动调用传入的对象的lock()函数,而当调用析构函数时,自动调用 unlock() 函数(这就是所谓的RAII,读者可自行搜索)。...mtx.lock()进行上锁 // std::lock_guard对象析构时,自动调用mtx.unlock()释放 std::lock_guard<std::mutex...,定义了 C11 标准中的一些表示线程、并发控制时原子操作的类与方法等。

1.1K60
您找到你想要的搜索结果了吗?
是的
没有找到

C++多线程-嵌套

嵌套这个概念,主要是为了根据编程中的一种情形引申出来的。什么情况呢,我们可以具体说明一下。假设你在处理一个公共函数的时候,因为中间涉及公共数据,所以你加了一个。但是,有一点比较悲哀。...这个公共函数自身也加了一个,而且和你加的是一样的。所以,除非你的使用的是信号量,要不然你的程序一辈子也获取不了这个。...所以本质上说,我们根本无法确定别人使用了什么样的。你也无权不让别人使用某个。所以,遇到这种情况,只好靠你自己了。嵌套就是不错的一个解决办法。...hNestLock->threadId = 0; ReleaseMutex(hNestLock->hLock); } } 文章总结: (1)嵌套与其说是新的类型...,不如说是统计而已 (2)嵌套和普通的一样,使用十分方便 (3)嵌套也有缺点,它给我们的检测带来了麻烦

1.2K20

C++多线程-自旋

自旋是SMP中经常使用到的一个。所谓的smp,就是对称多处理器的意思。在工业用的pcb板上面,特别是服务器上面,一个pcb板有多个cpu是很正常的事情。...我们可以看一段Linux 下的的自旋代码(kernel 2.6.23,asm-i386/spinlock.h),就可有清晰的认识了, static inline void __raw_spin_lock...1b\n" "3:\n\t" : "+m" (lock->slock) : : "memory"); } 上面这段代码是怎么做到自旋的呢...所以,如果其他的cpu之间没有获得访问权限,就会不断地查看当前是否可以再次申请自旋了。这个过程中间不会停歇,除非获得访问的权限为止。...总结: 1)在smp上自旋是多cpu互斥访问的基础 2)因为自旋是自旋等待的,所以处于临界区的代码应尽可能短 3)上面的LOCK_PREFIX,在x86下面其实就是“lock”,gcc下可以编过

1.3K10

C++多线程-读写

在编写多线程的时候,有一种情况是十分常见的。那就是,有些公共数据修改的机会比较少。相比较改写,它们读的机会反而高的多。通常而言,在读的过程中,往往伴随着查找的操作,中间耗时很长。...有,那就是读写。 (1)首先,我们定义一下基本的数据结构。...{ int count; int state; HANDLE hRead; HANDLE hWrite; }RWLock; 同时,为了判断当前的是处于读状态...、代码段运行时间长这两个条件下才会效率达到最大化; (2)任何公共数据的修改都必须在里面完成; (3)读写有自己的应用场所,选择合适的应用环境十分重要; (4)编写读写很容易出错,朋友们应该多加练习...; (5)读和写一定要分开使用,否则达不到效果。

1.5K20

C++多线程-windows

在windows系统中,系统本身为我们提供了很多。通过这些的使用,一方面可以加强我们对的认识,另外一方面可以提高代码的性能和健壮性。常用的以下四种:临界区,互斥量,信号量,event。...(1)临界区 临界区是最简单的一种。....*/) (2)互斥 互斥也是一种。和临界区不同的是,它可以被不同进程使用,因为它有名字。同时,获取和释放线程必须是同一个线程。...常用的互斥操作有 CreateMutex OpenMutex ReleaseMutex 那么,怎么用互斥进行数据的访问呢,其实不难。...因为在thread获得的使用权之前,常常需要main线程调用SetEvent设置一把才可以。关键是,在thread结束之前,我们也不清楚当前thread获得event之后执行到哪了。

1.4K20

C#多线程「建议收藏」

C#开发中会常遇到多线程的问题,当多个线程同时对同一个资源进行操作时,就需要注意线程同步的问题。线程如果不同步,可能会造成与预计不同的结果,这时就要对资源进行上锁。...当多个线程操作一个全局变量时,如果对全局变量进行上锁,则当一个线程访问这个全局变量时,另一个线程并不能去访问这个全局变量,只有等解锁资源后,其余线程才有机会去访问。这就保证了线程同步。...下面是示例: 两个线程fun1和fun2同时对队列进行入队操作,当入队数量比较小时,可能没有问题,当数量较大时,会发现队列中元素个数并不是两个线程入队元素的和。...t1.Start(); Thread t2 = new Thread(new ThreadStart(fun1)); t2.Name = "线程...委托来实例化Thread了,和ThreadStart一样的是它也是线程启动时要执行的方法,和ThreadStart不同的是,它在实例化时可以用一个带有一个Object参数的方法作为构造函数的参数,而实例化

51930

C# 多线程之ReaderWriterLockSlim

Read 和 Writer 锁定模式比较简单易懂:Read 模式是典型的共享锁定模式,任意数量的线程都可以在该模式下同时获得;Writer 模式则是互斥模式,在该模式下只允许一个线程进入该。...1、对于同一把、多个线程可同时进入读模式。 2、对于同一把、同时只允许一个线程进入写模式。 3、对于同一把、同时只允许一个线程进入可升级的读模式。...4、通过默认构造函数创建的读写是不支持递归的,若想支持递归 可通过构造 ReaderWriterLockSlim(LockRecursionPolicy) 创建实例。...5、对于同一把、同一线程不可两次进入同一状态(开启递归后可以) 6、对于同一把、即便开启了递归、也不可以在进入读模式后再次进入写模式或者可升级的读模式(在这之前必须退出读模式)。...8、读写锁具有线程关联性,即两个线程间拥有的的状态相互独立不受影响、并且不能相互修改其的状态。

1.3K20

C++多线程-无队列

对于编写多线程的朋友来说,队列具有天生的互斥性。在队列里面,一个负责添加数据,一个负责处理数据。谁也不妨碍谁,谁也离不开谁。所以,队列具有天生的并行性。..._QUEUE_DATA { int data[MAX_NUMBER]; int head; int tail; }QUEUE_DATA; 此时,一个线程压入数据...pQueue->tail] = data; pQueue->tail = (pQueue->tail + 1)% MAX_NUMBER; return OK; } 那么,还有一个线程就负责处理数据...->head]; pQueue->head = (pQueue->head + 1)% MAX_NUMBER; return OK; } 总结: (1)队列只适合两个线程并行使用...,一个压入数据,一个弹出数据 (2)队列是没有的并行,没有死锁的危险 (3)队列中head和tail只有在计算结束之前的时候才能进行自增运算

1K10

Linux同步机制(一) - 线程

1 互斥线程实际运行过程中,我们经常需要多个线程保持同步。 这时可以用互斥来完成任务。...然则没有划定,若是有writer在期待写,该若何? 还好,Linux有pthread_rwlockattr_setkind_np这个函数。...3 自旋 自旋是SMP架构中的一种low-level的同步机制。 当线程A想要获取一把自旋而该又被其它线程持有时,线程A会在一个循环中自旋以检测是不是已经可用了。...持有自旋线程在sleep之前应该释放自旋以便其它线程可以获得自旋。...3.5 销毁一个自旋 pthread_spin_destroy用来销毁指定的自旋并释放所有相关联的资源(所谓的所有指的是由pthread_spin_init自动申请的资源)在调用该函数之后如果没有调用

3.3K121

Linux C 编程——互斥mutex

1、多线程的问题引入 多线程的最大的特点是资源的共享,但是,当多个线程同时去操作(同时去改变)一个临界资源时,会破坏临界资源。...,每一个线程都尝试去写同一个文件,这样便出现了上述的问题,这便是共享资源的同步问题,在Linux编程中,线程同步的处理方法包括:信号量,互斥和条件变量。...2、互斥 互斥是通过的机制来实现线程间的同步问题。...()函数的过程略有不同: 当使用pthread_mutex_lock()函数进行加锁时,若此时已经被,则尝试加锁的线程会被阻塞,直到互斥被其他线程释放,当pthread_mutex_lock()函数有返回值时...同时,解锁的过程中,也需要满足两个条件: 解锁前,互斥必须处于锁定状态; 必须由加锁的线程进行解锁。 当互斥使用完成后,必须进行清除。

5.1K110

C++多线程开发之互斥

C++多线程开发之互斥 本文中的所有代码见《C++那些事》仓库。...该代码不会阻止两个线程同时读写总和。例如,两个线程都将sum的当前值复制到运行每个线程的CPU中(让我们选择123)。两个线程都将一个递增到自己的副本。两个线程都写回该值(124)。...如果线程在不同时间访问了总和,则计数将为125。 4.3 如何确保一次只有一个线程可以访问全局变量? 如果一个线程当前处于临界区,我们希望另一个线程等待,直到第一个线程完成。...为此,我们可以使用互斥(互斥的缩写)。 互斥形象比喻: 一个防止他人进入的简单方法,就是门口加一把。先到的人锁上门,后到的人看到上锁,就在门口排队,等打开再进去。...这就叫"互斥"(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。

93110

Linux C 编程——多线程

1、线程创建 在Linux中,新建的线程并不是在原先的进程中,而是系统通过一个系统调用clone()。该系统copy了一个和原先进程完全一样的进程,并在这个进程中执行线程函数。...在Linux中,通过函数pthread_create()函数实现线程的创建: int pthread_create(pthread_t *thread, const pthread_attr_t *attr...表示的是一个函数指针,该函数是线程调用函数; arg表示的是传递给线程调用函数的参数。...当线程创建成功时,函数pthread_create()返回0,若返回值不为0则表示创建线程失败。对于线程的属性,则在结构体pthread_attr_t中定义。...2、线程挂起 在上述的实现过程中,为了使得主线程能够等待每一个子线程执行完成后再退出,使用了free()函数,在Linux的多线程中,也可以使用pthread_join()函数用于等待其他线程,函数的具体形式为

6.3K40

Linux C 编程——多线程

1、线程创建 在Linux中,新建的线程并不是在原先的进程中,而是系统通过一个系统调用clone()。该系统copy了一个和原先进程完全一样的进程,并在这个进程中执行线程函数。...在Linux中,通过函数pthread_create()函数实现线程的创建: int pthread_create(pthread_t *thread, const pthread_attr_t *attr...表示的是一个函数指针,该函数是线程调用函数; arg表示的是传递给线程调用函数的参数。...当线程创建成功时,函数pthread_create()返回0,若返回值不为0则表示创建线程失败。对于线程的属性,则在结构体pthread_attr_t中定义。...2、线程挂起 在上述的实现过程中,为了使得主线程能够等待每一个子线程执行完成后再退出,使用了free()函数,在Linux的多线程中,也可以使用pthread_join()函数用于等待其他线程,函数的具体形式为

5.2K60

C#多线程系列(2):多线程lock和Monitor

1,Lock lock 原型 lock 编写实例 2,Monitor 怎么用呢 解释一下 示例 设置获取的时效 C# 中,可以使用 lock 关键字和 Monitor 类来解决多线程锁定资源和死锁的问题...例如: public void Access() { lock(this) {} } 可以阻止其它线程执行块(lock(o){})中的代码,当锁定时,其它线程必须等待中的线程执行完成并释放...其他任何线程都不能输入临界区,除非它使用不同的锁定对象执行临界区中的说明。 Wait 释放对象的,以允许其他线程锁定并访问对象。 调用线程会等待另一个线程访问对象。...使用脉冲信号通知等待线程关于对象状态的更改。 Pulse 、PulseAll 将信号发送到一个或多个等待线程。 信号通知等待线程:锁定对象的状态已更改,的所有者已准备好释放该。...正在等待的线程置于对象的就绪队列中,因此它可能最终接收对象的线程锁定后,它可以检查对象的新状态,以查看是否已达到所需的状态。 Exit 释放对象的

3.2K60

C++多线程原子性操作互斥

1.线程库 1.thread类的简单介绍 在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。...因此:C++11采用RAII的方式对进行了封装,即lock_guard和unique_lock。 mutex的种类 在C++11中,Mutex总共包了四个互斥量的种类 第一种:std::mutex。...使用以上类型互斥量实例化unique_lock的对象时,自动调用构造函数上锁,unique_lock对象销毁时自动调用析构函数解锁,可以很方便的防止死锁问题。...虽然加锁可以解决,但是加锁有一个缺陷就是:只要一个线程在对sum++时,其他线程就会被阻塞,会影响程序运行的效率,而且如果控制不好,还容易造成死锁。而在C++11中,引入了原子操作。...; i += 2;//偶数 flag = false; c.notify_one();//唤醒线程 } //到达这里,会解锁 }); thread t2(

1.1K40

Linux系统编程-(pthread)线程通信(读写)

一次只有一个线程可以占有写模式下的读写;但是多个线程可以同时占有读模式下的读写。 ​ 3. 读写锁在写加锁状态时,其他试图以写状态加锁的线程都会被阻塞。...读写锁在读加锁状态时,如果有线程希望以写模式加锁时,必须阻塞,直到所有线程释放。 ​ 4....当读写以读模式加锁时,如果有线程试图以写模式对其加锁,那么读写会阻塞随后的读模式请求,以避免读长期占用,而写得不到请求。 读写总结: 读写分为读和写。...如果资源被读写保护,多个线程可以同时获取读—也就是读支持多个线程同时读。 资源加了写之后,在写资源的时候只能被一个线程占用,其他读就会阻塞。 读和写也是互斥的关系。...但是读的时候可以支持多个线程同时读,写的时候只能被一个线程写,其他线程也不能读。 2. 读写锁相关函数 1.

1.3K10
领券