临界区

关于多线程同步的一点总结

有些话、适合烂在心里 提交于 2020-02-18 11:26:39
这两天看了下 MoreWindows 《秒杀多线程》系列的博客,稍微总结一下,就当笔记了。 http://blog.csdn.net/column/details/killthreadseries.html 1. CreateThread()与_beginthreadex()的区别 _beginthreadex在创建线程前(即调用CreateThread()前),先申请了一个用于存放线程私有数据的 _tidata 类型成员. 2. Interlocked系列函数 * LONG __cdecl InterlockedIncrement(LONG volatile* Addend); 相当++Addend; * LONG __cdecl InterlockedDecrement(LONG volatile* Addend); --Addend; * LONG __cdecl InterlockedExchangeAdd(LONG volatile* Addend, LONG Value); Addend + Value; 减法即Value取负值 * MSDN上对WaitForMultipleObjects()函数第一个参数作了说明:The maximum number of object handles is MAXIMUM_WAIT_OBJECTS(64)。 3. 多线程同步

c++多线程同步使用的对象

让人想犯罪 __ 提交于 2020-02-18 10:44:22
线程的同步 Critical section(临界区)用来实现“排他性占有”。适用范 围是单一进程的各线程之间 。它是: · 一个局部性对象,不是一个核心对象 。 · 快速而有效率 。 · 不能够同时有一个以上的critical section被等待 。 · 无法侦测是否已被某个线程放弃 。 Mutex Mutex是一个核心对象,可以在不同的线程之间实现“排他性占有”,甚至几十那些现成 分属不同进程 。它是: · 一个核心对象。 · 如果拥有mutex的那个线程结束,则会产生一个“abandoned”错误信息。 · 可以使用Wait…()等待一个mutex 。 · 可以具名,因此可以被其他进程开启。 · 只能被拥有它的那个线程释放(released )。 Semaphore Semaphore被用来追踪有限的资源。它是: · 一个核心对象。 · 没有拥有者。 · 可以具名,因此可以被其他进程开启。 · 可以被任何一个线程释放(released )。 Event Object Event object通常使用于overlapped I/O,或用来设计某些自定义的同步对象。它是: · 一个核心对象。 · 完全在程序掌控之下。 · 适用于设计新的同步对象。 · “要求苏醒”的请求并不会被储存起来,可能会遗失掉。 · 可 以具名,因此可以被其他进程开启 。 Interlocked

【Java并发工具类】Semaphore

风格不统一 提交于 2020-02-16 00:21:04
前言 1965年,荷兰计算机科学家Dijkstra提出的信号量机制成为一种高效的进程同步机制。这之后的15年,信号量一直都是并发编程领域的终结者。1980年,管程被提出,成为继信号量之后的在并发编程领域的第二个选择。目前几乎所有的语言都支持信号量机制,Java也不例外。Java中提供了 Semaphore 并发工具类来支持信号量机制。下面我们就来了解Java实现的信号量机制。 首先介绍信号量模型,然后介绍如何使用,最后使用信号量来实现一个限流器。 信号量模型 信号量模型图(图来自参考[1]): 信号量模型总结为:一个计数器、一个等待队列和三个对外调用的方法。 计数器和等待队列时对外透明的,所有我们只能通过三个对外方法来访问计数器和等待队列。 init() :设置计数器的初始值。 down() :计数器的值减一。如果此时计数器的值小于0,则当前线程插入等待队列并阻塞,否则当前线程可以继续执行。 up() :计数器的值加一。如果此时计数器的值小于或者等于0,则唤醒等待队列中的一个线程,并将其从等待队列中移除。 这三个方法都是原子性的,由实现信号量模型的方法保证。在Java SDK中,信号量模型是由 java.util.concurrent.Semaphore 实现。 信号量模型代码化大致类似如下: class Semaphore{ int count; // 计数器 Queue

操作系统线程和进程的同步机制和通信机制

♀尐吖头ヾ 提交于 2020-02-15 00:52:52
现在流行的进程线程同步互斥的控制机制,其实是由最原始最基本的4种方法实现的。由这4种方法组合优化就有了.Net和Java下灵活多变的,编程简便的线程进程控制手段: 临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event) 1. 线程间的同步通信机制 1.1 临界区 通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问 。在 任意时刻只允许一个线程对共享资源进行访问 ,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。 1.2 互斥量 采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问 。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。 1.3 信号量 它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 .信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV

Think In Java 21.3.5 临界区

做~自己de王妃 提交于 2020-02-10 17:33:04
有时,你只是希望防止多个线程同时访问方法内部的部分代码而不是防止访问整个方法。通过这种方式分离出来的代码段被称为 临界区(critical section) ,它也使用synchronized关键字建立。这里,synchronized被用来指定某个对象,此对象的锁被用来对花括号内的代码进行同步控制: synchronized(syncObject){ // This code can be accessed by only one task at a time } 这也被称为 同步控制块 ;在进入此段代码前,必须得到syncObject对象的锁。如果其他线程已经得到这个锁,那么就得等到锁被释放以后,才能进入临界区。 通过使用同步控制块,而不是对整个方法进行同步控制,可以使多个任务访问对象的时间性能得到显著提高,下面的例子比较了这两种同步控制方法。此外,它也演示了如何把一个非保护类型的类,在其他类的保护和控制之下,应用于多线程的环境: package lime.tij._021._003._005; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutorService; import java.util

并发编程之线程第二篇

北慕城南 提交于 2020-02-08 22:50:00
并发编程之线程第二篇 3.12 五种状态 3.13 六种状态 4.1 共享带来的问题 4.2 synchronized解决方案 4.4 变量的线程安全分析 4.6 Monitor概念 1. 轻量级锁 2. 锁膨胀 3.12 五种状态 这是从操作系统层面来描述的 【初始状态】仅是在语音层面创建了线程对象,还未与操作系统线程关联 【可运行状态】(就绪状态)指该线程已经被创建(与操作系统线程关联),可以由CPU调度执行 【运行状态】指获取了CPU时间片运行中的状态 (1)当CPU时间片用完,会从【运行状态】转换至【可运行状态】,会导致线程的上下文切换 【阻塞状态】 (1)如果调用了阻塞API,如BIO读写文件,这时该线程实际不会用到CPU,会导致线程上下文切换,进入【阻塞状态】 (2)等BIO操作完毕,会由操作系统唤醒阻塞的线程,转换至【可运行状态】 (3)与【可运行状态】的区别是,对【阻塞状态】的线程来说只要它们一直不唤醒,调度器就一直不会考虑调度它们 【终止状态】表示线程已经执行完毕,生命周期已经结束,不会再转换为其它状态 3.13 六种状态 这是从Java API层面来描述的 根据Thread.State枚举,分为六种状态 NEW 线程刚被创建,但是还没有调用start()方法 RUNNABLE 当调用了start()方法之后,注意,Java

linux之间进程通信

扶醉桌前 提交于 2020-02-02 00:17:47
进程间通信方式: 同主机进程间数据交换机制: pipe(无名管道) / fifo(有名管道)/ message queue(消息队列)和共享内存。 必备基础: fork() 创建一个与之前完全一样的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都 复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。    vfork : 与fork用法相同,但是他和父进程共享同样的数据存储,因此无需完全复制父进程的地址空间。 // fork() study example 1#include <unistd.h> #include <stdio.h> int main () { pid_t fpid; //fpid表示fork函数返回的值 int count=0; // fork 会将这个变量存在两个不同的内存中,所以两次count的值都是 1 ,而不是 1,2 。 fpid=fork(); if (fpid < 0) printf("error in fork!"); else if (fpid == 0) { printf("i am the child process, my process id is %d、n",getpid(

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 永远不会是负数。 /

操作系统-进程管理

我怕爱的太早我们不能终老 提交于 2020-01-28 02:11:18
进程管理 要点: 基础:进程描述及控制 策略:进程调度 实现:互斥与同步 避免:死锁与饥饿 解决:几个经典问题 进程的引入 程序的顺序执行 源代码程序,目标程序和可执行程序 程序执行:编辑,编译,链接,执行 程序的结构:顺序,分支,循环结构 程序执行的特征:顺序性,封闭性,可再现性 程序并发执行 多道程序设计技术:多个程序并发执行 程序并发执行时的特征:间断性,非封闭性,不可再现性 并发执行引发的问题: 协调各程序的执行顺序:输入数据还未全部输入内存时,计算必须等待 多个执行程序共享系统资源,程序之间可能会相互影响,甚至影响输出结果 选择那些,多少个程序进入内存执行 内存中的执行程序谁先执行,谁后执行 内存如何有效分配? 进程的概念 定义:可并发执行的程序,在一个数据集合上的运行过程 申请、拥有资源~调度(线程) 程序:静态概念,是指令和数据的集合,可长期存储 进程与程序对应关系 一个程序可以对应一个进程或者多个进程 一个进程可以对应一个程序,或者一段程序 进程的特征 动态性 并发性 独立性 异步性 引入进程带来的问题 增加了空间开销:为进程建立数据结构 额外的时间开销:管理和协调,跟踪,填写和更新有关数据结构,切换进程,保护现场 更难控制:协调多个进程竞争和共享资源如何预防;解决多个集成因为竞争资源而出现的故障 处理机的竞争尤为突出 进程的结构 组成(进程映像):程序,数据集合

JAVA高并发基础概念

女生的网名这么多〃 提交于 2020-01-21 17:44:19
我们在找工作时,经常在招聘信息上看到有这么一条:有构建大型互联网服务及高并发等经验,你第一时间想到的是媒体常说的双十一吗?带着问题,我们一起思考技术…. 高并发高并发 它是互联网分布式系统架构设计中必须考虑的因素之一,通常是指,保证系统能够同时并行化处理海量请求 同步和异步 同步:发送一个请求,等待返回,然后再发送下一个请求。提交请求 -> 等待服务器处理 -> 处理完返回,此期间客户端浏览器不能干任何事 异步:发送一个请求,不等待返回,随时可以再发送下一个请求。提交请求 -> 服务器处理(这时浏览器仍然可以做其他事情)-> 处理完毕 从上图可以知道,随着实时间的轨迹,同步一步一步的执行着,在异步中,当一个异步过程调用发出后,调用者不能立即得到结果,实际上会开启一个线程执行这部分内容,这个线程处理完了之后,通过状态,通知和回调来通知调用者来处理。 并发和并行 单核CPU(单处理器)上,只可能存在并发而不可能存在并行。 并行在多处理器系统中存在,而并发可以在单处理器和多处理器系统中都存在,并发能够在单处理器系统中存在是因为并发是并行的假象,并行要求程序能够同时执行多个操作,而并发只是要求程序假装同时执行多个操作(每个小时间片执行一个操作,多个操作快速切换执行 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有一个线程使用它,一旦临界去资源被占用