进程间通信:信号量

//main.cpp
#include <iostream>
#include <semaphore.h>
#include <pthread.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
#define _SIZE_ 10
using namespace std;

void EXIT(int arg)//注册信号处理函数。
{
    cout<<"Come Over!"<<endl;
    exit(0);
}
class sem
{
  public:
    sem(int Default = _SIZE_)
    {
        start = 0;
        end = 0;

        sem_init(&empty_size,0,0);
        sem_init(&exit_size,Default,0);

    }
    void SetStr(string s)
    {
        sem_post(&exit_size);
        str[end]=s;
        end = (end+1)%_SIZE_;
        sem_wait(&empty_size);
    }
    string GetStr()
    {
        string s;
        sem_wait(&exit_size);
        s = str[start];
        start = (start+1)%_SIZE_;
        sem_post(&empty_size);
        return s;
    }
    ~sem()
    {
        sem_destroy(&empty_size);
        sem_destroy(&exit_size);
    }
    private:
    int start;
  int end;
  string str[_SIZE_];
    sem_t empty_size;
    sem_t exit_size;
};

void* Write(void  *arg)
{
    sem *sm = (sem *)arg;
    while(1)
    {
        sm->SetStr("this is semaphore message!!");
        sleep(1);//让线程写的速度慢于线程读的速度,可以
             //看到互斥等待访问并不影响正常的需求。
    }
    return (void*) 0;
}

void* Read(void *arg)
{
    sem *sm = (sem *)arg;
    while(1)
    {
        cout<<sm->GetStr().c_str()<<endl;
    }
    return (void*) 0;
}

int main()
{
    sem sm;
    pthread_t idone,idtwe;
    signal(SIGINT,EXIT);//遇到2号信号SIGINT作出相应的处理。
    pthread_create(&idone,NULL,Write,&sm);
    pthread_create(&idtwe,NULL,Read,&sm);

    pthread_join(idone,NULL);
    pthread_join(idtwe,NULL);

    return 0;
}

//下面是Makefile

OUT=a.out
MAINCPP=main.cpp
MAINO=main.o
CC=g++
LIB=-lpthread

$(OUT):$(MAINO)
    @$(CC) -o [email protected] $^ $(LIB)
$(MAINO):$(MAINCPP)
    @$(CC) -c $<

.PHONY:clean
clean:
    rm -rf $(OUT) $(MIANO)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 12:29:43

进程间通信:信号量的相关文章

Linux程序设计学习笔记----System V进程间通信(信号量)

关于System V Unix System V,是Unix操作系统众多版本中的一支.它最初由AT&T开发,在1983年第一次发布,因此也被称为AT&T System V.一共发行了4个System V的主要版本:版本1.2.3和4.System V Release 4,或者称为SVR4,是最成功的版本,成为一些UNIX共同特性的源头,例如"SysV 初始化脚本"(/etc/init.d),用来控制系统启动和关闭,System V Interface Definitio

【转载】Linux的进程间通信-信号量

原文:Linux的进程间通信-信号量 Linux的进程间通信-信号量 版权声明: 本文章内容在非商业使用前提下可无需授权任意转载.发布. 转载.发布请务必注明作者和其微博.微信公众号地址,以便读者询问问题和甄误反馈,共同进步. 微博ID:orroz 微信公众号:Linux系统技术 前言 信号量又叫信号灯,也有人把它叫做信号集,本文遵循<UNIX环境高级编程>的叫法,仍称其为信号量.它的英文是semaphores,本意是“旗语”“信号”的意思.由于其叫法中包含“信号”这个关键字,所以容易跟另一个

进程间通信—信号量

进程间通信——信号量(信号灯) 信号与信号量 信号:是由用户.系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常,是一种处理异步事件的方式. 信号量:是一个特殊的变量,本质是计数器,记录了临界资源的数量.进程对其访问都是原子操作(PV操作),用于多线程.多进程之间同步临界资源. 信号量分类 按实现方式,信号量可以分为POSIX信号量与System V信号量. System V信号量是基于内核维护的,,通常用于Linux系统中.Posix是由文件系统中的路径名对应的名字来标识

Linux进程间通信 -- 信号量 semget()、semop()、semctl()

这篇文章将讲述别一种进程间通信的机制——信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信 -- 信号.下面就进入信号量的讲解. 一.什么是信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域.临界区域是指执行数据更新的代码需要独占式地执行.而信号量就可以提供这样的一种访问机制,让一个临界区同

进程间通信-信号量

信号量:它描述了当前某种资源的数量.它的意图在于进程间同步,就相当于一个计数器,它本身不具有数据交换的功能,而是通过控制其他通信资源来实现进程间通信. 当一个进程要访问临界资源时,先要进行P操作申请资源,当大于0时,资源可以请求,申请过后,若为0,则将进程挂起:当进程不再访问该信号量控制的资源时,进行V操作,若有进程挂起,则唤醒该等待的进程继续恢复访问,如果无挂起进程,就给它加1. 进程间同步:对临界资源的访问带有顺序性的,一个执行完毕,另一个才可以执行. 注意:对信号量的操作均为原子操作,因为

Linux - 进程间通信 - 信号量

一.概念 简单来讲,信号量是一个用来描述临界资源的资源个数的计数器. 信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件.外部设备等)来实现进程间通信, 他本身更只是一种外部资源的标识.信号量在此过程中负责数据操作的同步.互斥等功能. 当请求 一个使用信号量来表示 的资源时,进程需要先读取信号量的值来判断资源是否可用.大于0,资源可以请求:等于0,无资源可用, 进程会进入睡眠状态直至资源可用. 当进程不再使用一个使用信号量控制的共享资源时,信号量的值+1,

Linux进程间通信—信号量

二.信号量(semophore) 信号量是一种计数器,可以控制进程间多个线程或者多个进程对资源的同步访问,它常实现为一种锁机制.实质上,信号量是一个被保护的变量,并且只能通过初始化和两个标准的原子操作(P/V)来访问.(P,V操作也常称为wait(s),signal(s)) semaphore 与mutex类似,用于处理同步问题.我们说mutex像是一个只能容纳一个人的洗手间,那么semaphore就像是一个能容纳N个人的洗手间.其实从意义上来说,semaphore就是一个计数锁(我觉得将sem

Linux进程间通信 -- 信号量函数 signal()、sigaction()

一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止. 信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动.通常信号是由一个错误产生的.但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程.一个信号的产生叫生成,接收到一个信号

XSI进程间通信-----信号量

1. 基本特点 1) 相当于计数器,用于限制多个进程对有限共享资源的访问. 2) 多个进程获取有限共享资源的操作模式 A. 测试控制该资源的信号量: B. 若信号量大于0,则进程可以使用该资源, 为了表示此进程已获得该资源,需将信号量减1: C. 若信号量等于0,则进程休眠等待该资源, 直到信号量大于0,进程被唤醒,执行步骤A: D. 当某进程不再使用该资源时,信号量增1,  正在休眠等待该资源的其它进程将被唤醒. 2. 常用函数 1) 创建/获取信号量 int semget (key_t ke

Linux进程间通信-信号量

当多个进程表同时访问系统上的某个资源的时候,比如同时写一个数据库的某条记录,或者同时修改某个文件,就需要考虑进城的同步问题,以确保任一时刻只有一个进程可以拥有对资源的独占式访问.通常,程序对共享资源的访问的代码只是很短的一段,你就是这一段代码引发了进程之间的竞态条件.我们称这段代码为关键代码段,或者临界区. 信号量是一种特殊的变量,它只能取自然数并只支持两种操作:等待(wait)和信号(signal),这两种操作更常见的称呼是P.V操作.假设有信号量SV,则对它的P.V操作含义如下: l  P(