多线程--信号量

信号量可以获取多次,可以用来保护一定数量的同种资源,信号量的典型用例是控制生产者和消费者之间共享的环形缓冲区

生产者,消费者实例中对同步的需求有两处:

1.生产者快于消费者,将会覆盖消费者还没有读取的数据;

2.生产者慢于消费者,将会读取到一些过期的数据;

两种解决方案:

1.首先使生产者填满缓冲区,然后等待消费者读取整个缓冲区;

2.使生产者和消费者线程同时分别操作缓冲区的不同部分;

#include <QCoreApplication>

#include<QSemaphore>
#include<QThread>
#include<stdio.h>

const int DataSize=1000;
const int BufferSize=80;
int buffer[BufferSize];

QSemaphore freeBytes(BufferSize); //生产者信号量,目前空闲的单元数为80
QSemaphore usedBytes(0);         //消费者信号量,目前可用的单元数为0

class Producer:public QThread
{
public:
    Producer();
    void run();
};

Producer::Producer()
{

}
void Producer::run()
{
    for(int i=0;i<DataSize;i++)
    {
        freeBytes.acquire();//生产者首先获得一个空闲单元,若此时缓冲区被消费者尚未读取的数据填满,对此函数的调用就会阻塞
        buffer[i%BufferSize]=(i%BufferSize); //buffer的最大量80
        usedBytes.release();//表示这个单元被填写,消费者可以使用
    }

}

class Consumer:public QThread
{
   public:
    Consumer();
    void run();

};

Consumer::Consumer()
{

}
void Consumer::run()
{
    for(int i=0;i<DataSize;i++)
     {
        usedBytes.acquire();   //消费和线程首先获取一个可被读取的单元,若缓冲区没有包含任何可以读取的数据,对此函数的调用阻塞
        fprintf(stderr,"%d",buffer[i%BufferSize]);//stderr标准错误流
        if(i%16==0&&i!=0)
        {
            fprintf(stderr,"\n");               //每16个数据进行一次换行打印

        }
        freeBytes.release();                    //单元变成空闲,生产者可用
    }
    fprintf(stderr,"\n");
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Producer producer;  //生产者线程
    Consumer consumer;  //消费者线程
    producer.start();
    consumer.start();

    producer.wait();
    producer.wait();

    return a.exec();
}

buffer作为缓冲区;

生产者和消费者线程同时工作,依次输出1000个数据;

时间: 2024-10-31 07:09:46

多线程--信号量的相关文章

C#多线程--信号量(Semaphore)

百度百科:Semaphore,是负责协调各个线程, 以保证它们能够正确.合理的使用公共资源.也是操作系统中用于控制进程同步互斥的量. Semaphore常用的方法有两个WaitOne()和Release(),Release()的作用是退出信号量并返回前一个计数,而WaitOne()则是阻止当前线程,直到当前线程的WaitHandle 收到信号.这里我举一个例子让大家更容易理解:当我们这样实例化Semaphore时候 Semaphore sema = new Semaphore( x , y );

linux环形buff模拟多线程信号量操作

互斥锁mutex变量的值非0即1,只能用来表示两种状态下的临界资源.而信号量是与之类似的,用来表示可用资源的,区别在于,信号量可以表示多个可用资源的. --值为2的信号量也就是特殊的互斥锁了. 那么下边就简单实现信号量表示多个资源访问的生产者消费者问题了. #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <semaphore.h> #include <pthread

JAVA多线程--信号量(Semaphore)

简介 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确.合理的使用公共资源. 一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者.但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动.拿到信号量的线程可以进入代码,否则就等待.通过acqu

PYTHON 多线程信号量

#!/usr/bin/env python # -*- coding: utf-8 -*- import threading import time import random def work_func():     print "worker thread is started at %s"% threading.current_thread()     random.seed()     time.sleep(random.random())     print "wo

java多线程-信号量

Semaphore(信号量)是一个线程同步结构,用于在线程间传递信号,以避免出现信号丢失,或者像锁一样用于保护一个关键区域.自从 5.0 开始,jdk 在 java.util.concurrent 包里提供了 Semaphore 的官方实现,因此大家不需要自己去实现 Semaphore. 简单的 Semaphore 实现 使用 Semaphore 来发出信号 可计数的 Semaphore 有上限的 Semaphore 把 Semaphore 当锁来使用 简单的 Semaphore 实现 下面是一

多线程信号量的运用

1.信号量的初始化sem_init()函数语法 2.信号量sem_wait()操作,里面传递的参数首先-1,然后判断里面的参数-1之后是否>=0,是 则执行后面程序,否 则卡死在那里直到参数>=0 为止 信号量sem_post()操作,里面传递的参数+1, 代码分析:生产者和消费者问题 /*producer-customer.c*/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #inc

java多线程--信号量Semaphore的使用

Semaphore可以控制某个共享资源可被同时访问的次数,即可以维护当前访问某一共享资源的线程个数,并提供了同步机制.例如控制某一个文件允许的并发访问的数量. 例如网吧里有100台机器,那么最多只能提供100个人同时上网,当来了第101个客人的时候,就需要等着,一旦有一个人人下机,就可以立马得到了个空机位补上去.这个就是信号量的概念. Semaphore类位于java.util.concurrent包内.下面通过实例来使用这个类: package com.wang.thread; import

Python并发编程:多线程-信号量,Event,定时器

一 信号量 信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行,如果说互斥锁是合租房屋的人去抢一个厕所,那么信号量就相当于一群路人争抢公共厕所,公共厕所所有多个坑位,这意味着同一时间可以有多个人上公共厕所,但公共厕所容纳的人数是一定的,这便是信号量的大小 from threading import Thread, Semaphore import threading import time def func(): sm.a

Workflow笔记2——状态机工作流(转)

出处:http://www.cnblogs.com/jiekzou/p/6192813.html 在上一节Workflow笔记1——工作流介绍中,介绍的是流程图工作流,后来微软又推出了状态机工作流,它比流程图功能更加强大. 状态机工作流:就是将工作流系统中的所有的工作节点都可以看做成一个状态节点.每个节点都有N个状态,其中都包含初始状态.进入状态.离开状态等.当节点的状态变化的时候会执行某个节点. 新建项目StatueWorkflowConsoleApp 自动添加了一个起始节点和一个状态节点.