互斥体

Atomic Operations (standardized memory model)

余生颓废 提交于 2020-02-07 21:35:05
C ++规范未引用任何特定的编译器,操作系统或CPU。它引用了 abstract machine 抽象机,它是对实际系统的概括。 在语言规范中,程序员的工作是为抽象机编写代码。编译器的工作是在具体机器上实现该代码。通过严格按照规范进行编码,可以确定您的代码可以在不使用兼容C ++编译器的任何系统上进行编译和运行,而无论是现在还是50年后。 C ++ 98 / C ++ 03规范中的抽​​象机基本上是单线程的。因此,不可能编写相对于规范“完全可移植”的多线程C ++代码。规范甚至没有说关于内存加载和存储的原子性或加载和存储可能发生的顺序的任何事情,不用管互斥锁之类的事情。 当然,您可以在实践中为特定的具体系统(例如pthread或Windows)编写多线程代码。但是没有标准的方法可以为C ++ 98 / C ++ 03编写多线程代码。 C ++ 11中的抽象机在设计上是多线程的。它还具有定义明确的内存模型;也就是说,它说明了在访问内存时编译器可能会做什么,可能不会做什么。 考虑以下示例,其中两个线程同时访问一对全局变量: 线程2可能输出什么? 在C ++ 98 / C ++ 03下,这甚至不是“未定义行为”;这个问题本身是没有意义的,因为该标准并未考虑任何被称为“线程”的东西。 在C ++ 11下,结果是未定义行为,因为加载和存储通常不需要是原子的。看起来似乎并没有太大的改善

C# 多线程 Mutex Monitor Lock

僤鯓⒐⒋嵵緔 提交于 2020-01-31 03:27:33
lock关键字 lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。此语句的形式如下: Object thisLock = new Object(); lock (thisLock) { // Critical code section } lock 确保当一个线程位于代码的临界区时, 另一个 线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。 lock 调用块开始位置的 Enter 和块结束位置的 Exit 。 通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this) 、 lock (typeof (MyType)) 和 lock ("myLock") 违反此准则: 如果实例可以被公共访问,将出现 lock (this) 问题。 如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。 由于进程中使用同一字符串的任何其他代码将共享同一个锁,所以出现 lock(“myLock”) 问题。 最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。 下例使用线程和 lock 。只要 lock 语句存在,语句块就是临界区并且 balance 永远不会是负数。 /

基元线程同步构造之 Mutes(互斥体)

核能气质少年 提交于 2020-01-30 07:12:52
  互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex))。   互斥体禁止多个线程同时进入受保护的代码“ 临界区 ”(critical section)。    因此,在任意时刻,只有一个线程被允许进入这样的代码保护区。任何线程在进入 临界区 之前,必须获取(acquire)与此区域相关联的互斥体的所有权。如果已有另一线程拥有了 临界区 的互斥体,其他线程就不能再进入其中。这些线程必须等待,直到当前的属 主线程 释放(release)该互斥体。什么时候需要使用互斥体呢?互斥体用于保护共享的易变代码,也就是,全局或静态数据。这样的数据必须通过互斥体进行保护,以防止它们在多个线程同时访问时损坏。    互斥体(mutex)代表一个互斥的锁。它的工作方式和AutoResetEvent(或者计数为1的Semaphore)相似,因为所有这三种构造一次都只释放一个正在等待的线程, 实例化一个mutex时,就默认释放了一个正在等待的线程,类似于初始化了一个 new AutoResetEvent(true) 。下面展示了Mutex类的样子:   public sealed class Mutex:WaitHandle{ public Mutex(); public void ReleaseMutex(); }    互斥体有一些而外的逻辑在里面

winform 窗体、多线程影响

柔情痞子 提交于 2020-01-27 00:05:57
1.窗体的隐藏与显示 this.show() this.Hide() 2.MDI多文档界面 设置父窗体,IsMDIContainer = true; 设置子窗体,Form2 fr2 = new Form2(); fr2.MdiParent = this; fr2.Show(); MDI子窗体排列:MDILayOut.Horizal:水平平铺,垂坠平铺,叠层平铺 3.继承窗体实现的两种方式: 通过编写代码 :Form2 : WinFormApplication.Form1;一定是命名空间.窗体对象; 通过窗体选择器:通过项目添加winform窗体中的继承窗体。 修改子窗体中控件的属性,父窗体中的属性Medifiers设置为public,否则不能修改子窗体中的属性。 4.读取注册表中的信息 主要通过RegistryKey类中的OpenSubKey方法,GetSubKeyNames方法,GetValueNames方法实现 5.使用多线程的3种情况 1)执行占用大量时间的操作 2)区分具有不同优先级的任务 3)使用户界面可以在将时间分配给后台任务时仍能快速做出响应 6.使用多线程将产生的不良情况 1)因为线程为占用内存空间,使用多线程后,创建进程、AppDomain对象及线程数目将受到内存的限制 2)跟踪大量的线程将耗费大量的处理器时间,如果线程过多,则其中大多数线程不会产生明显的进度

线程同步机制的区别与比较及进程通信方法

非 Y 不嫁゛ 提交于 2020-01-07 12:59:21
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 有关多线程的一些技术问题: 1、 何时使用多线程? 2、 线程如何同步? 3、 线程之间如何通讯? 4、 进程之间如何通讯? 先来回答第一个问题,线程实际主要应用于四个主要领域,当然各个领域之间不是绝对孤立的,他们有可能是重叠的,但是每个程序应该都可以归于某个领域: 1、 offloading time-consuming task。由辅助线程来执行耗时计算,而使GUI有更好的反应。我想这应该是我们考虑使用线程最多的一种情况吧。 2、 Scalability。服务器软件最常考虑的问题,在程序中产生多个线程,每个线程做一份小的工作,使每个CPU都忙碌,使CPU(一般是多个)有最佳的使用率,达到负载的均衡,这比较复杂,我想以后再讨论这个问题。 3、 Fair-share resource allocation。当你向一个负荷沉重的服务器发出请求,多少时间才能获得服务。一个服务器不能同时为太多的请求服务,必须有一个请求的最大个数,而且有时候对某些请求要优先处理,这是线程优先级干的活了。 4、 Simulations。线程用于仿真测试。 我把主要的目光放在第一个领域,因为它正是我想要的。第二和第三个领域比较有意思,但是目前不在我的研究时间表中。 线程的同步机制: 1、 Event 用事件(Event

linux 多线程编程

穿精又带淫゛_ 提交于 2019-12-24 12:27:07
原文地址: 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型。Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。 大家知道,进程是资源分配的单位,同一进程中的多个线程共享该进程的资源(如作为共享内存的全局变量)。Linux中所谓的“线程”只是在被创建时clone了父进程的资源,因此clone出来的进程表现为“线程”,这一点一定要弄清楚。因此,Linux“线程”这个概念只有在打冒号的情况下才是最准确的。 目前Linux中最流行的线程机制为LinuxThreads,所采用的就是线程-进程“一对一”模型,调度交给核心,而在用户级实现一个包括信号处理在内的线程管理机制。LinuxThreads由Xavier Leroy (Xavier.Leroy@inria.fr)负责开发完成,并已绑定在GLIBC中发行,它实现了一种BiCapitalized面向Linux的Posix 1003.1c “pthread”标准接口。Linuxthread可以支持Intel、Alpha、MIPS等平台上的多处理器系统。 按照POSIX 1003.1c 标准编写的程序与Linuxthread 库相链接即可支持Linux平台上的多线程,在程序中需包含头文件pthread. h

C#线程学习笔记六:线程同步--信号量和互斥体

拈花ヽ惹草 提交于 2019-12-10 23:47:22
本笔记摘抄自: https://www.cnblogs.com/zhili/archive/2012/07/23/Mutex_And_Semaphore.html ,记录一下学习过程以备后续查用。 一、信号量(Semaphore) 信号量(Semaphore)是由内核对象维护的int变量。当信号量为0时,在信号量上等待的线程会堵塞;信号量大于0时,就解除堵塞。当在一个信号量上等待 的线程解除堵塞时,内核自动会将信号量的计数减1。在.NET下通过Semaphore类来实现信号量同步。 Semaphore类 限制可同时访问某一资源或资源池的线程数。 线程通过调用 WaitOne方法将信号量减1,并通过调用Release方法把信号量加1。 先说下构造函数: public Semaphore(int initialCount,int maximumCount);通过两个参数来设置信号的初始计数和最大计数。 下面代码演示信号量同步的使用: class Program { //共享资源 public static int number = 0; //初始信号量计数为0,最大计数为10。 public static Semaphore semaphore = new Semaphore(0, 10); static void Main(string[] args) { #region 线程同步

内核同步-锁机制

好久不见. 提交于 2019-12-09 20:44:18
在 Linux 系统上,多个进程可以同时运行,以及各种中断发生的中断也在同时得到处理,这种多个上下文宏观上同时运行的情况称为并发。并发具体包括如下几种可能: 1) UP平台上,一个进程正在执行时被另一个进程抢占; 2) UP平台上,一个进程正在执行时发生了中断,内核转而执行中断处理程序; 3) SMP平台上,每个处理器都会发生 UP 平台上的情况; 4) SMP平台上,多个进程或中断同时在多个 CPU 上执行; 多个并发的上下文同时使用同一个资源的情况称为竞态,而可能发生竞态的这一段代码称为临界区。内核编程时的临界区,比较多的情况是: 1) 代码访问了全局变量,并且这段代码可被多个进程执行; 2) 代码访问了全局变量,并且这段代码可被进程执行,也可被中断处理程序执行; 针对上述情况,内核提供了如下手段来解决竟态问题: 1)锁机制: 2)院子操作: 下面会先介绍锁机制。 Linux内核提供了多种锁机制,这些锁机制的区别在于,当获取不到锁时,执行程序是否发生睡眠并进行系统调度。具体包括自旋锁、互斥体、信号量。 一、自旋锁:spinlock_t 自旋锁有两个基本操作:获取与释放。获取自旋锁时,当判断锁的状态为未锁,则会马上加锁,如果已经是锁定的状态,当期执行流程则会执行“忙等待”,中间没有任何的调度操作。也就说执行流程从判断锁的状态到完成加锁,是一个原子操作,在执行上是不可分割的。

boost::thread线程管理

≯℡__Kan透↙ 提交于 2019-12-03 14:46:54
6.1. 概述 线程就是,在同一程序同一时间内允许执行不同函数的离散处理队列。 这使得一个长时间去进行某种特殊运算的函数在执行时不阻碍其他的函数变得十分重要。 线程实际上允许同时执行两种函数,而这两个函数不必相互等待。 一旦一个应用程序启动,它仅包含一个默认线程。 此线程执行 main() 函数。 在 main() 中被调用的函数则按这个线程的上下文顺序地执行。 这样的程序称为单线程程序。 反之,那些创建新的线程的程序就是多线程程序。 他们不仅可以在同一时间执行多个函数,而且这在如今多核盛行的时代显得尤为重要。 既然多核允许同时执行多个函数,这就使得对开发人员相应地使用这种处理能力提出了要求。 然而线程一直被用来当并发地执行多个函数,开发人员现在不得不仔细地构建应用来支持这种并发。 多线程编程知识也因此在多核系统时代变得越来越重要。 本章将介绍C++ Boost库 Boost.Thread ,它可以开发独立于平台的多线程应用程序。 6.2. 线程管理 在这个库最重要的一个类就是 boost::thread ,它是在 boost/thread.hpp 里定义的,用来创建一个新线程。下面的示例来说明如何运用它。 #include <boost/thread.hpp> #include <iostream> void wait(int seconds) { boost::this

Delphi - 互斥对象下实现系统的单例模式

匿名 (未验证) 提交于 2019-12-02 23:57:01
使用CreateMutex函数创建互斥对象 利用Windows系统函数CreateMutex(),找出当前系统是否已经存在指定进程的实例,如果没有则创建一个互斥体。 CreateMutex函数原型如下: function CreateMutex(lpMutexAttributes: PSecurityAttributes; bInitialOwner: BOOL; lpName: PChar): THandle; 其中参数: lpMutexAttributes :SECURITY_ATTRIBUTES 结构类型指针,可以为NULL。 bInitialOwner :是否初始化互斥体。 lpName :互斥体对象的名称,一般是工程的名称。 最终,函数返回一个互斥体句柄。 Delphi WinFrm利用互斥对象实现单例模式 单击Project,View Source; uses 中添加Windows; Begin和End之间添加如下代码。 //*****************************单例模式******************************** CreateMutex(nil, False, 'Application Name'); if GetLastError = ERROR_ALREADY_EXISTS then begin Application