信号量机制

用信号量机制解决生产者消费者问题

南笙酒味 提交于 2020-12-14 09:15:33
使用POSIX标准中的Pthreads API来创建多个生产者、消费者线程 定义线程:pthread_t tid 创建线程:pthread_create(&tid,&attr,runner,argv[1]); join线程:pthread_join(tid,NULL); 使用PthreadsAPI的信号量机制互斥与同步 定义信号量:sem_t sem 初始化信号量:sem_init(&sem, 0, n); P操作:sem_wait(&sem); V操作:sem_post(&sem); #include <stdio.h> #include <pthread.h> #include <semaphore.h> #define BUFF_SIZE 5 // 定义缓冲区buffer大小为5 int buffer[BUFF_SIZE]; // 用循环队列模拟缓冲区 int in = 0; // 产品进缓冲区时的缓冲区下标 int out = 0; // 产品出缓冲区时的缓冲区下标 int productID = 0; // 产品号 int consumeID = 0; // 将被消耗的产品号 sem_t s; // 定义互斥信号量, 互斥锁s sem_t n; // 定义同步信号量n, buffer中已放入的产品个数 sem_t e; // 定义同步信号量e, buffer中空单元个数

线程同步和互斥

百般思念 提交于 2020-04-01 09:45:17
异步:好比赛跑,各跑各的,互不打扰 同步:好比接力赛,必须接棒后才能跑 互斥:好比独木桥,一次只能过一个 WIN32中的同步机制主要有: 1).临界区(Critical section) 2).信号量(semaphore) 3).互斥量(mutex) 4).事件(Event) 用户模式下:原子操作,临界区,通过对多线程的串行化的操作来访问公共资源或一段代码,速度快,适合控制数据访问。 内核模式下:1.互斥量:为协调共同对一个共享资源的单独访问而设计。 2.信号量:为控制一个具有有限数量用户资源而单独设计。 3.事件:用来通知线程有一些事件已经发生,从而启动后继任务的开始。 来源: https://www.cnblogs.com/liu6666/p/12610415.html

操作系统-进程管理

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

C#编程总结(三)线程同步

会有一股神秘感。 提交于 2020-01-14 02:13:30
线程同步 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行。对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应。对于服务器应用程序,多线程处理提供了用不同线程处理每个传入请求的能力。否则,在完全满足前一个请求之前,将无法处理每个新请求。然而,线程的异步特性意味着必须协调对资源(如文件句柄、网络连接和内存)的访问。否则,两个或更多的线程可能在同一时间访问相同的资源,而每个线程都不知道其他线程的操作。 "如果觉得有用,请帮顶! 如果有不足之处,欢迎拍砖!" 线程同步的方式 线程同步有:临界区、互斥区、事件、信号量四种方式   临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别   1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。   2、互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享

C#编程总结(三)线程同步

不羁岁月 提交于 2020-01-14 02:12:29
注:本文为个人学习摘录,原文地址:http://www.cnblogs.com/yank/p/3227324.html 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行。对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应。对于服务器应用程序,多线程处理提供了用不同线程处理每个传入请求的能力。否则,在完全满足前一个请求之前,将无法处理每个新请求。然而,线程的异步特性意味着必须协调对资源(如文件句柄、网络连接和内存)的访问。否则,两个或更多的线程可能在同一时间访问相同的资源,而每个线程都不知道其他线程的操作。 "如果觉得有用,请帮顶! 如果有不足之处,欢迎拍砖!" 线程同步的方式 线程同步有:临界区、互斥区、事件、信号量四种方式   临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别   1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。   2、互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限

第3章 JDK并发包(二)

大城市里の小女人 提交于 2019-12-25 02:10:38
3.1.2 重入锁的好搭档:Condition条件 它和wait()和notify()方法的作用是大致相同的。但是wait()和notify()方法是和synchronized关键字合作使用的,而Condition是与重入锁相关联的。通过Lock接口的Condition newCondition()方法可以生成一个与当前重入锁绑定的Condition实例。利用Condition对象,我们就可以让线程在合适的时间等待,或者在某一种特定的时刻得到通知,继续执行。 Condition接口提供的基本方法如下: void await() throws InterruptedException; void awaitUninterruptibly(); long awaitNanos(long nanosTimeout) throws InterruptedException; boolean await(long time, TimeUnit unit) throws InterruptedException; boolean awaitUntil(Date deadline) throws InterruptedException; void signal(); void signalAll(); 以上方法的含义如下: await()方法使当前线程等待,同时释放当前锁

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

Gevent模块,协程应用

十年热恋 提交于 2019-12-05 03:12:28
Gevent官网文档地址: http://www.gevent.org/contents.html 进程、线程、协程区分 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译为协同的例程,一般我们都简称为协程。 在linux系统中,线程就是轻量级的进程,而我们通常也把协程称为轻量级的线程即微线程。 进程和协程 下面对比一下进程和协程的相同点和不同点: 相同点: 相同点存在于,当我们挂起一个执行流的时,我们要保存的东西: 栈, 其实在你切换前你的局部变量,以及要函数的调用都需要保存,否则都无法恢复 寄存器状态,这个其实用于当你的执行流恢复后要做什么 而寄存器和栈的结合就可以理解为上下文,上下文切换的理解: CPU看上去像是在并发的执行多个进程,这是通过处理器在进程之间切换来实现的,操作系统实现这种交错执行的机制称为上下文切换 操作系统保持跟踪进程运行所需的所有状态信息。这种状态,就是上下文。 在任何一个时刻,操作系统都只能执行一个进程代码,当操作系统决定把控制权从当前进程转移到某个新进程时,就会进行上下文切换,即保存当前进程的上下文,恢复新进程的上下文,然后将控制权传递到新进程,新进程就会从它上次停止的地方开始。 不同点: 执行流的调度者不同,进程是内核调度,而协程是在用户态调度,也就是说进程的上下文是在内核态保存恢复的

win32API多线程编程

烂漫一生 提交于 2019-12-02 19:00:14
win32线程API 在Windows平台下可以通过Windows的线程库来实现多线程编程。 对于多线程程序可以使用Visual Studio调试工具进行调试,也可以使用多核芯片厂家的线程分析调试工具进行调试。 Win32 API(了解Windows,代码小,效率高) Windows操作系统为内核以及应用程序之间提供的接口 将内核提供的功能进行函数封装 应用程序通过调用相关的函数获得相应的系统功能 _beginthread _beginthread(函数名,栈大小,参数指针) Win32 函数库中提供了操作多线程的函数, 包括创建线程、管理线程、终止线程、线程同步等接口。 线程函数(线程开始执行的函数) DWORD WINAPI ThreadFunc (LPVOID lpvThreadParm ); 线程创建 HANDLE CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); 第一个参数lpThreadAtt,是一个指向SECURITY- ATTRIBUTES结构的指针

Java 并发工具包 java.util.concurrent 用户指南

陌路散爱 提交于 2019-12-01 00:08:04
译序 本指南根据 Jakob Jenkov 最新博客翻译, 请随时关注博客更新 本指南已做成中英文对照阅读版的 pdf 文档,有兴趣的朋友可以去 Java并发工具包java.util.concurrent用户指南中英文对照阅读版 进行下载。 1. java.util.concurrent - Java并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包。这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类。在这个包被添加以前,你需要自己去动手实现自己的相关工具类。 本文我将带你一一认识 java.util.concurrent 包里的这些类,然后你可以尝试着如何在项目中使用它们。本文中我将使用 Java 6 版本,我不确定这和 Java 5 版本里的是否有一些差异。 我不会去解释关于 Java 并发的核心问题 - 其背后的原理,也就是说,如果你对那些东西感兴趣,参考 《Java 并发指南》 半成品 本文很大程度上还是个 “半成品”,所以当你发现一些被漏掉的类或接口时,请耐心等待。在我空闲的时候会把它们加进来的。 2. 阻塞队列BlockingQueue java.util.concurrent 包里的 BlockingQueue 接口表示一个线程安放入和提取实例的队列。本小节我将给你演示如何使用这个