Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post 有名信号量 #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For mode constants */ #include <semaphore.h> sem_t *sem_open(co…
posix信号量 Link with -lpthread. sem_t *sem_open(const char *name, int oflag);//打开POSIX信号量 sem_t *sem_open(const char *name, int oflag,mode_t mode, unsigned int value); int sem_init(sem_t *sem, int pshared, unsigned int value); posix互斥锁(第七章)int pthread_…
继上次学习了posix线程之后,这次来讨论一下posix信号量与互斥锁相关的知识: 跟posix消息队列,共享内存的打开,关闭,删除操作一样,不过,上面的函数是对有名信号量进行操作,通过man帮助可以得知: 有名信号量相对的那就是无名信号量,对于它相关的函数如下: 同样可以查看man帮助: [思考]:是不是无名信号量就无法用于不同进程间的多个线程间进行通信呢?实际上不是这样的: 而对于信号量的P.V操作,可以用以下两个函数,既能用于有名,也能用于无名信号量: 初始化互斥锁: 锁定操作: 解锁操作…
一.posix 信号量 信号量的概念参见这里.前面也讲过system v 信号量,现在来说说posix 信号量. system v 信号量只能用于进程间同步,而posix 信号量除了可以进程间同步,还可以线程间同步.system v 信号量每次PV操作可以是N,但Posix 信号量每次PV只能是1.除此之外,posix 信号量还有命名和匿名之分(man 7 sem_overview): 1.命名信号量 名字以/somename 形式分辨,只能有一个/ ,且总长不能超过NAME_MAX - 4(一…
生产者消费者问题,又有界缓冲区问题.两个进程共享一个一个公共的固定大小的缓冲区.其中一个是生产者,将信息放入缓冲区,另一个是消费者,从缓冲区中取信息. 问题的关键在于缓冲区已满,而此时生产者还想往其中放入一个新的数据的情况.其解决办法是让生产者睡眠,待消费者从缓冲区中取出一个或多个数据时再唤醒它,同样的, 当消费者试图从缓冲区中取数据而发现缓冲区空时,消费者就睡眠,直到消费者向其中放一些数据后再将其唤醒. 上述方法可以用互斥量解决,程序代码: #include<sys/types.h> #in…
Posix条件变量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_cond_destroy(pthread_cond_t *cond); int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); int pthread_cond_timedwait(pthread_cond_t *cond…
Posix读写锁 int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr); int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); int pthread_rwlock_wrlock(pthre…
-posix信号量信号量 是打开一个有名的信号量 sem_init是打开一个无名的信号量,无名信号量的销毁用sem_destroy sem_wait和sem_post是对信号量进行pv操作,既可以使用在有名的信号量也可以使用在无名的信号量 无名信号量是否意味着它不能够用于不同进程的多个线程之间的通信了 如果sem_init是非零的参数,那么这个无名的信号量可以用于不同进程间的多个线程之间的通信,前提条件是这个信号量的对象必须存储在共享内存区才可以. 上面这是互斥锁是无名的互斥锁,同样也可以可以用…
前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用  http://www.cnblogs.com/ngnetboy/p/3521547.html 的解释: 如果有共享的资源sum,与之相关联的mutex 是lock_s.如果每一个线程对sum的操作非常easy的,与sum的状态无关,比方仅仅是sum++.那么仅仅用mutex足够了.程序猿仅仅要确保每一个线程操作前,取得lock,然后sum++,再unlock就可以.每一个线程的代码将像这…
POSIX信号量接口,意在解决XSI信号量接口的几个不足之处: POSIX信号量接口相比于XSI信号量接口,允许更高性能的实现. POSIX信号量接口简单易用:没有信号量集,其中一些接口模仿了我们熟悉的文件系统操作. POSIX信号量删除时的处理更加合理.XSI信号量被删除后,使用该信号量标识符的操作将会出错返回,并将errno设置为EIDRM.而对于POSIX信号量,操作可以继续正常执行,直到对该信号量的最后一个引用被释放. )来自同一进程的各个线程(2)来自不同进程的各个线程,但是这些进程映…
关键词:mutex.MCS.OSQ. <Linux并发与同步专题 (1)原子操作和内存屏障> <Linux并发与同步专题 (2)spinlock> <Linux并发与同步专题 (3) 信号量> <Linux并发与同步专题 (4) Mutex互斥量> <Linux并发与同步专题 (5) 读写锁> <Linux并发与同步专题 (6) RCU> <Linux并发与同步专题 (7) 内存管理中的锁> <Linux并发与同步专…
Table of Contents 1. 线程同步 1.1. 用信号量进行同步 1.2. 用互斥量进行同步 2. 参考资料 线程同步 了解线程信号量的基础知识,对深入理解python的线程会大有帮助. 当两个线程同时执行时,不可避免同时操作同一个变量或者文件等,所以需要有一组机制来确保他们能正确的运行:信号量和互斥量.信号量可以分为最简单的"二进制信号量"和更通用的"计数信号量".信号量通常用来保护一段代码,使其每次只能被一个执行线程运行,这种情况下需要用到二进制信…
1. 理解如下,言简意赅的说,信号量解决同步,互斥量解决竞争. 信号量用于同步,主要任务间和中断间同步:互斥量用于互锁,用于保护同时只能有一个任务访问的资源,为资源上一把锁. 互斥量具有优先级继承,信号量没有. 互斥量不能用在中断服务程序中,信号量可以,这个就不太明白了? 创建互斥量和创建信号量的API函数不同,但是共用获取和给出信号API函数. 2. 互斥量与二进制信号量最大的不同是:互斥量具有优先级继承机制.也就是说,如果一个互斥量(令牌)正在被一个低优先级任务使用,此时一个高优先级企图获取…
之前介绍的几种解决进程间互斥的方案,不管是Peterson方案还是TSL指令的方式,都有一个特点:当一个进程被Block到临界区外面时,被Block的进程会一直处于忙等待的状态,这个不但浪费了CPU资源,还会有一个很坏的副作用.假设两个进程,H,L,H的优先级高,L进程的优先级非常低,CPU的调度规则是只要H处于Ready状态,则开始运行H,问题来了: H处于BLock状态,可能在等待外部资源 L进入了临界区 H处于Ready状态(外部资源满足),L还没有离开临界区 按照调度规则,CPU会Swi…
import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class Test { public static void main(String[] args) { GunClip clip = new GunClip(); Producer p = new Producer(clip); customer c = new customer(clip); p.star…
POSIX信号量相关函数 sem_open 功能: initialize and open a named semaphore 原型: sem_t *sem_open(const char *name, int oflag); 参数: name : 信号量的名字 oflag : 返回值: 成功 : 返回新信号量的地址 失败 : SEM_FAILED errno Link with -pthread sem_close 功能: close a named semaphore 原型: int sem…
线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁.如何利用已有对象来服务(不止一个不同的任务)就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因.比如大家所熟悉的数据库连接池正是遵循这一思想而产生的,本文将介绍的线程池技术同…
1.简介 POSIX信号量是一个sem_t 类型的变量,但POSIX 有两种信号量的实现机制:无名信号量和命名信号量.无名信号量可以用在共享内存的情况下, 比如实现进程中各个线程之间的互斥和同步.命名信号量通常用于不共享内存的情况下,比如不共享内存的进程之间. 1.1POSIX 无名信号量 在使用信号量之前,必须对其进行初始化.sem_init 函数初始化指定的信号量: int sem_init (sem_t *sem, int pshared, unsigned int value) 无名信号…
本篇通过互斥量来解决线程的同步,学习其中的一些知识. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互斥量Mutex主要将用到四个函数.下面是这些函数的原型和使用说明. 第一个 CreateMutex 函数功能:创建互斥量(注意与事件Event的创建函数对比) 函数原型: HANDLECreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL…
一.posix 条件变量 一种线程间同步的情形:线程A需要等某个条件成立才能继续往下执行,现在这个条件不成立,线程A就阻塞等待,而线程B在执行过程中使这个条件成立了,就唤醒线程A继续执行. 在pthread库中通过条件变量(Condition Variable)来阻塞等待一个条件,或者唤醒等待这个条件的线程.Condition Variable用pthread_cond_t类型的变量表示,和Mutex的初始化和销毁类似,pthread_cond_init函数初始化一个Condition Vari…
全局初始化互斥量和条件变量(不全局也行,但至少要对线程启动函数可见,这样才能使用.) static pthread_cont_t cond = PTHREAD_COND_INITIALIZER; static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 使用互斥量锁住一块代码方法如下(默认忽略pthread开头的函数的错误检查,即类似 int s = pthread_xxx(...); if (s != 0) { printErrorMsg(…
先贴代码和测试结果 // Mutex.h: 对pthread的互斥量的RAII包装 #ifndef _MUTEX_H_ #define _MUTEX_H_ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> // 使用错误码errnum和字符串msg来打印错误信息, 并且退出程序 static inline void errExitEN(int err…
package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY */ public class MySystem { // 缓存区的个数 private int count = 0; // s1 s2为信号量 private MyInt s1 = new MyInt();// 生产者信号量,初始值为0->表示没有可以存放产品的空间 private MyInt s2…
在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程序,从保持着几 t 甚或几 p 的数据的数据库系统,到手机上的一个有良好用户响应能力的 app,为了充分利用每个 CPU 内核,都会想到是否可以使用多线程技术.这里所说的"充分利用"包含了两个层面的意思,一个是使用到所有的内核,再一个是内核不空闲,不让某个内核长时间处于空闲状态.在 C++98 …
1. 线程的同步与互斥 1.1. 线程的互斥 在Posix Thread中定义了一套专门用于线程互斥的mutex函数.mutex是一种简单的加锁的方法来控制对共享资源的存取,这个互斥锁只有两种状态(上锁和解锁),可以把互斥锁看作某种意义上的全局变量.为什么需要加锁,就是因为多个线程共用进程的资源,要访问的是公共区间时(全局变量),当一个线程访问的时候,需要加上锁以防止另外的线程对它进行访问,实现资源的独占.在一个时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程能够对共享资源进行操作.若其他线…
线程特定数据 int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *)); int pthread_key_delete(pthread_key_t key); int pthread_setspecific(pthread_key_t key, const void *pointer); void * pthread_getspecific(pthread_key_t key); pthread_onc…
POSIX线程库 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以"pthread_"开头,要使用这些函数库,要通过引入头文<pthread.h>,而且链接这些线程函数库时要使用编译器命令的"-lpthread"选项[Ubuntu系列系统需要添加的是"-pthread"选项而不是"-lpthread",如Ubuntu 14.04版本,深度Ubuntu等] 1.pthread_create int pt…
线程概念 在一个程序里的一个执行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列/指令序列"; 一切进程至少有一个执行线程; 进程  VS. 线程  1.进程是资源分配(进程需要参与资源的竞争)的基本单位,而线程是处理器调度(程序执行)的最小单位; 2.线程共享进程数据,但也拥有自己的一部分(非常少O(∩_∩)O~)数据,如线程ID.程序计数器.一组寄存器.堆栈.errno(错误代码).信号状态.优先级等; 3.一个进程内部的线程可以共享资源,如代码段.数…
线程概念 在一个程序里的一个运行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列/指令序列"; 对于每一个进程至少有一个运行线程; 进程  VS. 线程  1.进程是资源分配(进程须要參与资源的竞争)的基本单位,而线程是处理器调度(程序运行)的最小单位; 2.线程共享进程数据,但也拥有自己的一部分数据,如 线程ID.一组寄存器.堆栈.errno(错误代码).信号状态.优先级等; 3.一个进程内部的线程能够共享资源,如代码段.数据段.打开文件和信号等(例如以…
在单线程程序中.我们常常要用到"全局变量"以实现多个函数间共享数据, 然而在多线程环境下.因为数据空间是共享的.因此全局变量也为全部线程所共同拥有.但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却能够跨多个函数訪问.POSIX线程库通过维护一定的数据结构来解决问题.这个些数据称为(Thread-specific-data或 TSD). 相关函数例如以下: int pthread_key_create(pthread_key_t *key, void (*des…