进程_线程_进程/线程间通信
文章平均质量分 76
wangpengqi
这个作者很懒,什么都没留下…
展开
-
线程:信号量 sem_wait sem_post
信号量的数据类型为结构sem_t,它本质上是一个长整型的数。函数sem_init()用来初始化一个信号量。它的原型为: extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value)); sem为指向信号量结构的一个指针;pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享转载 2012-08-14 12:28:35 · 1213 阅读 · 0 评论 -
信号概念
首先,每个信号有个名字。这些名字都以字符串SIG开头。例如SIGABRT是当一个进程调用abort函数时产生的终止信号。SIGALRM是当 alram函数设置的计时器到时时产生的闹铃信号。版本7有15个不同的信号;SVR4和4.4BSD有31个不同的信号。FreeBSD 5.2.1、Mac OS X 10.3和Linux2.4.22支持31个不同的信号,而Sloaris 9支持38个不同的信号。然转载 2012-09-03 23:08:10 · 2061 阅读 · 0 评论 -
Linux下c开发 之 线程通信
1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型。Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。 大家知道,进程是资源分配的单位,同一进程中的多个线程共享该进程的资源(如作为共享内存的全局变量)。Linux中所谓的“线程”只是在被创建时clone转载 2012-08-14 10:50:48 · 1480 阅读 · 0 评论 -
读写锁
话说小明驾车正从银行返回家里的途中,还在琢磨银行中取钱过程中银行的相关事宜。想想每次排队来办业务真麻烦。也就是自己这次取的钱比较多,才这么麻烦,否则,自己才懒得来呢。其实,现在银行做的已经不错了,为了减少业务员的工作量,同时,也是缩短银行业务的办理时间和办理途径,在全国各地,各大城市的各个地图都安置了n多取款机,像一些简单的业务,如查询各余额、打印个账单之类的,可以不用到银行,直接在取款机就办了,转载 2012-10-27 18:24:23 · 935 阅读 · 0 评论 -
linux信号量编程
/*********************程序相关信息*********************程序编号:014程序编写起始日期:2008.11.2程序编写完成日期:2008.11.2程序修改日期: 修改备注:程序目的:学习linux信号量所用主要函数:ftok(),semget(),semop(),se转载 2012-10-22 16:14:00 · 561 阅读 · 0 评论 -
linux system V IPC 信号灯和共享内存实例
#include#include#include#include#include#include#include#include#define MAXSHM 5 //定义缓冲区数组的下标变量个数/* 定义3个信号量的内部标识 */int fullid;int emptyid;int mutexid;/* 主函转载 2012-10-22 16:36:08 · 1252 阅读 · 0 评论 -
QNX多线程同步之Barrier(屏障)
之前和大家介绍过QNX上的线程同步方法metux和semophore,通过这两种方法可以对一个或者几个资源进行加锁,避免资源使用上的冲突。在另一种情况下,某个线程需要在其它线程完成工作后才继续执行,这时就需要使用到线程同步方法barrier。 举个现实的例子,假设有三个士兵在操作一门高炮,一个负责装填炮弹,一个负责调整高炮左右方向,一个负责调整高炮角度。很明显高炮需要在三名士兵完成转载 2012-10-27 21:19:18 · 699 阅读 · 0 评论 -
Linux下pthread的读写锁的优先级问题
有这么一个情况:有一个C实现的HashMap,需要在多个线程之间共享。对它的读操作远远大于写操作。所以采用了pthread的读写锁来保障并发读写时的一致性。现在测试发现的问题是:因为读操作太多,导致写操作一直拿不到锁。按理说不应该啊,假如有三个线程,线程1 先申请读锁并成功拿到,然后线程2申请写锁那么必然会陷入等待,之后线程3去申请读锁,那么应该是陷入等待才对,因为pthread_rwlo转载 2012-10-27 21:19:54 · 3024 阅读 · 2 评论 -
线程间_读写锁属性
Linux多线程之读写锁 Linux多线程之读写锁一、获取和释放读写锁#include int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);int pthread_rwlock_unlock转载 2012-10-27 17:56:29 · 1062 阅读 · 0 评论 -
IPC通信:Posix消息队列的属性设置
IPC通信:Posix消息队列的属性设置Posix消息队列的属性使用如下结构存放:struct mq_attr { long mq_flags; /*阻塞标志位,0为非阻塞(O_NONBLOCK)*/ long mq_maxmsg; /*队列所允许的最大消息条数*/ long mq_msgsize; /*每条消息的最大字节数*/转载 2012-11-14 15:54:18 · 767 阅读 · 0 评论 -
linux多线程学习(二)——线程的创建和退出
在上一篇文章中对线程进行了简单的概述,它在系统中和编程的应用中,扮演的角色是不言而喻的。学习它、掌握它、吃透它是作为一个程序员的必须作为。在接下来的讲述中,所有线程的操作都是用户级的操作。在LINUX中,一般pthread线程库是一套通用的线程库,是由POSIX提出的,因此他的移植性是非常好的。 创建线程实际上就是确定调用该线程函数的入口点,这里通常使用的函数是pthread_c转载 2013-08-01 18:41:48 · 893 阅读 · 0 评论 -
linux多线程学习(五)——信号量线程控制
在上一篇文章中,讲述了线程中互斥锁的使用,达到对共享资源互斥使用。除了使用互斥锁,信号量,也就是操作系统中所提到的PV原语,能达到互斥和同步的效果,这就是今天我们所要讲述的信号量线程控制。PV原语是对整数计数器信号量sem的操作,一次P操作可使sem减一,而一次V操作可是sem加一。进程(或线程)根据信号量的值来判断是否对公共资源具有访问权限。当信号量的值大于零或等于零的时候,该进程(或线转载 2013-08-01 18:43:24 · 1084 阅读 · 0 评论 -
linux多线程学习(六)——信号量实现同步
在上一篇文章中已经用信号量来实现线程间的互斥,达到了互斥锁的效果,今天这篇文章将讲述怎样用信号量去实现同步。信号量的互斥同步都是通过PV原语来操作的,我们可以通过注册两个信号量,让它们在互斥的问题上互动,从而达到同步。通过下面实例就可以很容易理解: [cpp] view plaincopy#include #inc转载 2013-08-01 18:44:09 · 817 阅读 · 0 评论 -
linux多线程学习(三)——线程属性设置
在上一篇文章中,介绍了线程的创建和退出,以及相关函数的使用。其中pthread_create函数的第二个参数,是关于线程属性的设置,这也是今天所有讲述的。这些属性主要包括邦定属性、分离属性、堆栈地址、堆栈大小、优先级。其中系统默认的是非邦定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。在pthread_create中,把第二个参数设置为NULL的话,将采用默认的属性配置。(1)邦定属转载 2013-08-01 18:42:25 · 720 阅读 · 0 评论 -
linux多线程学习(四)——互斥锁线程控制
在前面的文章中提及到,一个进程中的多个线程是共享同一段资源的,由于线程对资源的竞争引出了锁。其中mutex是一种简单的加锁方法,这个互斥锁只有两种状态,那就是上锁和解锁,可以把互斥锁看作是某种意义上的全局变量。在某一时刻,只能有一个线程取得这个互斥上的锁,拥有上锁状态的线程可以对共享资源进行操作,而其他线程在该线程未解锁之前,够会被挂起,直到上锁的线程解开锁。可以这么说,互斥锁使得共享资源按序的在转载 2013-08-01 18:42:55 · 934 阅读 · 0 评论 -
linux多线程学习(七)——实现“生产者和消费者”
在上一篇文章中,利用信号量实现了线程间的互斥,这一篇将要利用信号量的互斥同步机制来实现一个经典实例,就是“生产者和消费者”。1、简单描述生产者和消费者的问题。有一个缓冲区和两个线程:生产者和消费者。生产者把产品放入缓冲区,而消费者从缓冲区中拿走。当缓冲区满时,生产者必须等待;另外,当缓冲区空时,消费者必须等待,并且缓冲区不能同时进行生产者和消费者的操作。[c转载 2013-08-01 18:44:37 · 1045 阅读 · 0 评论 -
共享内存 shm
共享内存 共享内存是第二种IPC工具。他允许两个无关的进程访问相同的逻辑内存。共享内存是在两个运行的程序之间传递数据的有效手段。尽管X/Open标准并没有要求,很可能绝大数的共享内存实现都是会将不同进程之间正在共享的内存安排在相同的物理内存中。共享内存为在多个进程之间共享与传递数据提供一个有效的手段。因为他并没有提供同步的方法,所以通常我们需要使用其他的机制来同步对共享内存的访问。转载 2012-09-07 00:12:49 · 691 阅读 · 0 评论 -
信号量IPC
返回本讲概述信号量信号量是最早出现的用来解决进程同步与互斥问题的机制,包括一个称为信号量的变量及对它进行的两个原语操作。本节将从以下几个方面进行介绍--一. 信号量的概念 1. 信号量的类型定义2. PV原语转载 2012-09-08 14:24:40 · 485 阅读 · 0 评论 -
线程间通讯《代码》pthread_cond_t
#define _GNU_SOURCE#include #include #include #include //static pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;// 这里虽然是 P/V ,但是用 cond 确实更方便。static pthread_c转载 2012-08-14 12:19:54 · 742 阅读 · 0 评论 -
线程间通讯《代码》pthread_cond_wait/signal
/* pthread_cond_wait(&cond,&lock) 函数:将 lock 解锁,再将条件变量 cond 加锁 pthread_cond_signal( &cond) 函数:将 cond 解锁*/#include #include #include int buf[1000000]; int w=0,r=0; //r是读指针,w是写转载 2012-08-14 14:33:21 · 680 阅读 · 0 评论 -
条件锁pthread_cond_t 的应用
名称 pthread_cond_init, pthread_cond_destroy, pthread_cond_signal, pthread_cond_broadcast, pthread_cond_wait, pthread_cond_timedwait - 状态操作。 大纲 #include pthread_cond_t cond = PTH转载 2012-08-14 22:29:19 · 727 阅读 · 0 评论 -
pthread_mutex_init函数《代码》
/*#include int pthread_mutex_init(pthread_mutex_t *restrict mutex, constpthread_mutexattr_t *restrict attr);int pthread_mutex_destroy(pthread_mutex_t *mutex);在使用互斥锁前,需要定义互斥锁(转载 2012-08-15 09:06:45 · 4651 阅读 · 0 评论 -
pthread_cond_signal函数《代码》--生产者与消费者
pthread_cond_signal函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.如果没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回。但使用pthread_cond_signal不会有“惊群现象”产生,他最多只给一个线程发信号。假如有多个线程正在阻塞等待着这个条件变量的话,那么 是根据各等待线程优先级的高低确定哪个转载 2012-08-14 21:53:23 · 704 阅读 · 0 评论 -
pthread条件变量函数的使用
推荐的pthread_cond_wait()和pthread_cond_signal()使用方式:pthread_mutex_lock(&m);while( condition_is_false ) pthread_cond_wait(&cond, &m);pthread_mutex_unlock(&m);另一端一般是:pthread_mutex_lock(&转载 2012-08-14 22:11:44 · 671 阅读 · 0 评论 -
pread函数
我们在3.11节介绍了pread和pwrite。这些函数有助于多线程环境,因为进程里的所有线程共享相同的文件描述符。考虑两个线程同时读或写一个相同的文件。线程A:lseek(fd, 300, SEEK_SET);read(fd, buf1, 100);线程B:lseek(fd, 700, SEEK_SET);read(fd, buf2, 100)转载 2012-08-14 23:19:41 · 5525 阅读 · 0 评论 -
消息队列函数详解
消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点。作为早期unix通信机制之一的信号能够传送的信息量有限,后来虽然POSIX 1003.1b在信号的实时性方面作了拓广,使得信号在传递信息量方面有了相当程度的改进,但是信号这种通信方式更像"即时"的通信方式,它要求接受信号的进程在某个时间范围内对信号做出反应,因此该信号最多在接受信号进程的生命周期内才有意义,信号所传递的信息是接近于随转载 2012-09-19 09:23:33 · 1291 阅读 · 0 评论 -
管道的应用(pipe)《深入分析Linux内核源码》
7.1.1 Linux管道的实现机制在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为:· 限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不象文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写转载 2012-09-19 15:14:36 · 3421 阅读 · 0 评论 -
msgctl函数
#include #include #include #include #include typedef struct msg_t{ long type;//必须为整型(int或 long 或无符号),不能为chr char name[20]; char mtext[50];}MSG;int main(void){ struct msqid_ds转载 2012-09-18 17:20:58 · 1301 阅读 · 0 评论 -
信号量与线程互斥锁的区别
援引CU上一篇帖子的内容:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在 哪里)。而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这 个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。有的时候锁和信号量转载 2012-09-18 10:36:12 · 527 阅读 · 0 评论 -
《信号量》讲解
7.3.1信号量信号量及信号量上的操作是E.W.Dijkstra 在1965年提出的一种解决同步、互斥问题的较通用的方法,并在很多操作系统中得以实现, Linux改进并实现了这种机制。信号量(semaphore )实际是一个整数,它的值由多个进程进行测试(test)和设置(set)。就每个进程所关心的测试和设置操作而言,这两个操作是不可中断的,或称“原子”操作,即一旦开始直到两个操作全部完转载 2012-09-17 22:44:17 · 1319 阅读 · 1 评论 -
《消息队列》函数讲解
7.3.2消息队列一个或多个进程可向消息队列写入消息,而一个或多个进程可从消息队列中读取消息,这种进程间通讯机制通常使用在客户/服务器模型中,客户向服务器发送请求消息,服务器读取消息并执行相应请求。在许多微内核结构的操作系统中,内核和各组件之间的基本通讯方式就是消息队列。例如,在 MINIX 操作系统中,内核、I/O 任务、服务器进程和用户进程之间就是通过消息队列实现通讯的。Linux中的转载 2012-09-17 18:58:08 · 1336 阅读 · 0 评论 -
消息队列
所谓消息队列就是指一个消息链表。int msgget(key_t, int flag):创建和打开队列int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int flag):发送消息,msgid是消息队列的id,msgp是消息内容所在的缓冲区,msgsz是消息的大小,msgflg是标志。int msgrcv(int msqi转载 2012-09-17 17:19:25 · 636 阅读 · 0 评论 -
popen() 函数 讲解
描述popen() 函数 用 创建管道 的 方式启动一个 进程, 并调用 shell. 因为 管道是被定义成单向的, 所以 type 参数 只能定义成 只读或者 只写, 不能是 两者同时, 结果流也相应的 是只读 或者 只写.command 参数 是 一个 字符串指针, 指向的是一个 以 null 结束符 结尾的字符串, 这个字符串包含 一个 shell 命令. 这个命令 被送到 /bin转载 2012-09-11 11:22:33 · 955 阅读 · 0 评论 -
linux多线程学习(一)
进程是系统中程序执行和资源分配的基本单位。每个进程都有自己的数据段,代码段和堆栈段,这就导致了进程在进行切换等操作起到了现场保护作用。但是为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销,进程演化中出现了另外一个概念,这就是线程,也被人称为轻量级的进程。它是一个进程内的基本调度单位。线程是在共享的内存空间中并发的多道执行路径,它们共享一个进程的资源,比如文件描述符和信号处理等。因此,转载 2013-08-01 18:41:18 · 664 阅读 · 0 评论