线程安全及重入函数

本文详细介绍了线程安全的概念及其重要性,探讨了线程安全与重入的区别,并提出了实现线程安全的多种策略,包括避免共享状态和同步共享状态的方法。
首先,我们要知道什么事线程。
一个线程执行的是,可以独立地被一个管理编程指令的最小序列调度,这通常是一部分的操作系统。线程和所述的实施过程的操作系统之间的不同,但在大多数情况下,一个线程的过程的是一个组成部分。多个线程可以在一个过程中存在,执行同时和共享的资源,例如存储器,而不同的过程不共享这些资源。特别是,一个进程的线程共享其可执行代码和它的变量在任何给定时间的值。

线程安全是一个计算机编程应用的背景下概念的多线程程序。一段代码是线程安全的,如果操纵只有在保证在同一时间安全执行多个线程的方式共享数据结构。有用于使线程安全数据结构的各种策略。

一个程序可以在多个线程同时在一个共享的执行代码的地址空间,每个这些线程的访问几乎所有的内存所有其他线程。线程安全是一个属性,允许代码通过重新建立一些控制的实际流量和节目的文本之间的对应关系的在多线程环境中运行,借助于同步。


不同的供应商使用线程安全稍微不同的术语:
线程安全:实施保证是免费的竞态条件时同时被多个线程访问。
有条件安全:不同的线程可以同时访问不同的对象,并访问共享数据,从竞争条件的保护。
不是线程安全的:代码不应该由不同的线程同时访问。


线程安全保障,通常还包括设计步骤,以防止或限制的不同形式的风险死锁,以及优化以最大化并发性能。然而,无死锁保证不能总是给出的,因为死锁可以由以下原因引起的回调和违反建筑分层独立的库本身的。


下面我们来讨论避免两种方式的竞争条件,以实现线程安全。


第一类办法的重点是避免共享状态,包括:
重入 
编写代码,因为它可以被一线索部分执行这样的方式,用相同的线程重新执行或同时由另一个线程执行,并且仍然正确完成原来的执行。这需要的节省状态信息中的局部变量每次执行时,通常在一个堆栈,而不是在静态或全局变量或其它非本地状态。所有非本地状态必须通过原子操作来访问和数据结构也必须折返。
线程本地存储 
变量是局部的,这样每个线程都有自己的专用副本。这些变量保留在他们的价值观子程序和其他代码边界,是线程安全的,因为它们是地方给每个线程,即使它访问它们的代码可能会被另一个线程同时执行。
不变对象 
对象的状态不能施工后进行更改。这意味着这两个只有只读数据是共享的,得到这样的固有线程安全。可变(非const)操作然后可以在他们创建新的对象,而不是修改现有这样的方式来实现。这种方法是由用于串中的Java,C#和Python实现。

第二类的方法是同步的相关,而在情况所使用的地方不能避免共享状态:
互斥
对共享数据的访问被序列化使用机制,确保只有一个线程读取或随时写入共享数据。需要互斥的掺入经过深思熟虑的,因为使用不当会导致类似副作用死锁,活锁和资源耗尽。
原子操作 
共享数据,通过使用不能由其他线程打断原子操作访问。这通常需要使用特殊的机器语言指令,这可能会在提供运行时库。由于操作都是原子,共享数据总是保持在一个有效的状态,不管其他线程如何访问它。原子操作形成的许多螺纹锁定机构的基础上,和用于实现互斥原语。


接下来详细说说重入和线程安全(PS:这是网上找的相关资料)

C ++类往往是重入的,仅仅是因为他们只能访问自己的成员数据。任何线程可以调用一个可重入类的实例成员函数,只要没有其他线程可以在调用一个成员函数一样在同一时间类的实例。例如,柜台下方类是可重入的:


该类不是线程安全的,因为如果多个线程试图修改数据成员Ñ,结果是不确定的。这是因为++-操作并不总是原子。事实上,他们通常会扩大到三个机器指令:

  1. 在寄存器装入变量的值。
  2. 递增或递减寄存器的值。
  3. 存储的寄存器的值返回到主存储器。

如果线程A和线程B同时加载变量的旧值,增加其注册,并将其存储回去,他们最终互相覆盖,变量递增只有一次!

线程安全

显然,访问必须被序列化:线程A必须执行步骤1,2,3,而不线程B可以执行相同的步骤之前中断(原子); 或相反亦然。一个简单的方法,使类线程安全是为了保护所有访问与数据成员QMutex


QMutexLocker类自动锁定在其构造互斥体和解锁时析构函数被调用时,在函数的结尾。锁定互斥确保来自不同的线程访问将被序列化。该互斥数据成员的声明可变预选赛,因为我们需要锁定和解锁的互斥值(),这是一个const函数。






评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值