首页 > 其他分享 >信号量

信号量

时间:2023-05-07 09:33:06浏览次数:36  
标签:node int 信号量 mutex pthread sem

有几个线程就有几个除互斥信号之外的信号量,每个线程等待自己的信号量有位置,

并最后给其他信号量位置。初始时,生产者的值非0,消费者的值为0。

/*
        #include <semaphore.h>

        int sem_init(sem_t *sem, int pshared, unsigned int value);
            参数:
                sem:信号量
                pshared:0用在线程,非0用在进程
                value:信号量中的值


        int sem_destroy(sem_t *sem);
            释放资源

        int sem_wait(sem_t *sem);
            信号量-1,为0时阻塞线程

        int sem_trywait(sem_t *sem);
            信号量-1,为0立即返回
        int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

        int sem_post(sem_t *sem);
            信号量+1
        int sem_getvalue(sem_t *sem, int *sval);  
            获取信号量的值
*/
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>

pthread_cond_t cond;



struct Node
{
    int num;
    struct Node* next;
};

struct Node *head = NULL;
pthread_mutex_t mutex;
sem_t proid, cusid;

void *producer(void *arg)
{   

    while(1)
    {
        sem_wait(&proid);
        pthread_mutex_lock(&mutex);
        struct Node* node = (struct Node*) malloc(sizeof(struct Node));
        node->num = rand() % 1000;
        node->next = head;
        head = node;
        printf("add node, num: %d, tid: %ld\n", node->num, pthread_self());
        usleep(100);
        pthread_mutex_unlock(&mutex);
        sem_post(&cusid);
    }
    return NULL;
}

void *customer(void *arg)
{
    while(1)
    {
        sem_wait(&cusid);
        pthread_mutex_lock(&mutex);

        struct Node* node = head;
        head = head->next;

        printf("delete node, num: %d, tid: %ld\n", node->num, pthread_self());
        free(node);
        usleep(100);
        pthread_mutex_unlock(&mutex);
        sem_post(&proid);
    }
    return NULL;
}






int main()
{
    sem_init(&proid, 0, 8);
    sem_init(&cusid, 0, 0);

    pthread_mutex_init(&mutex, NULL);


    pthread_t ptids[5], ctids[5];

    for(int i = 0; i < 5; i++)
    {
        pthread_create(&ptids[i], NULL, producer, NULL);
        pthread_create(&ctids[i], NULL, customer, NULL);
    }


    for(int i = 0; i < 5; i++)
    {
        pthread_detach(ptids[i]);  // pthread_join是阻塞的,所以多个线程最好用detach
        pthread_detach(ctids[i]);
    }


    while(1)
    {
        sleep(10);
    }


    pthread_mutex_destroy(&mutex);




    pthread_exit(NULL);

    return 0;
}

 

标签:node,int,信号量,mutex,pthread,sem
From: https://www.cnblogs.com/WTSRUVF/p/17378902.html

相关文章

  • 信号量
    sys/sem.h#include<sys/sem.h>intmain(void){//创建新的或者获取已有的信号量集/**semget创建新的或者获取已有的信号量集*key:ftok函数返回的key*nsemsint信号量集中信号量个数*semflg标志位置**///操作信......
  • 进程间通信方式———3、信号量(Semaphore)
    1.信号量信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一......
  • Linux 进程信号量 All In One
    Linux进程信号量AllInOne进程信号量processsignaldemos(......
  • 【Java 并发】【九】【AQS】【七】Semaphore信号量底层机制原理
    1 前言接下来我们来看看Semaphore,也是基于之前讲解的AQS来实现的,建立在AQS体系之上的一个并发工具类。2  Semaphore是什么Semaphore,它是一个信号量,主要作用是用来控制并发中同一个时刻执行的线程数量,可以用来做限流器,或者流程控制器。在创建的时候会指定好它有多少个信号量......
  • 《操作系统原理、实现与实践》实践项目5&6:信号量&地址映射与共享
    教员布置的操作系统的第一个大作业,其中有一些知识相对而言比较重要,包括一些操作过程都具有重复实验的价值;所以写一个blog记录一下,方便一下以后重复这个大实验或是复现。分为三个部分:实验环境的配置、实验5的实现、实验6的实现。实验环境的配置:KylinOS应该是可以实现的,实现的原......
  • 进程间通信-信号量
    资源竞争资源竞争:当多个进程在同时访问共享资源时,会产生资源竞争,最终最导致数据混乱临界资源:不允许同时有多个进程访问的资源,包括硬件资源(CPU、内存、存储器以及其他外围设备)与软件资源(共享代码段、共享数据结构)临界区:访问临界资源代码多进程对stdout资源的竞争......
  • 多线程的同步和互斥—线程的信号量
    同步://account.h#ifndef_ACCOUNT_H#define_ACCOUNT_H#include<pthread.h>#include<semaphore.h>typedefstruct{intcode;doublebalance;......
  • C# 多线程访问之 SemaphoreSlim(信号量)【进阶篇】
    C#多线程访问之SemaphoreSlim(信号量)【进阶篇】 阅读目录一、简介二、用法示例 三、属性or函数or方法释义属性-AvailableWaitHandle属性-CurrentCount......
  • 多线程编程五:信号量
    2.33.信号量的概念_哔哩哔哩_bilibili2.34.信号量的工作机制_哔哩哔哩_bilibili......
  • 【并发编程六】c++进程通信——信号量(semaphore)
     【并发编程六】c++进程通信——信号量(semaphore)一、概述二、信号量三、原理四、过程1、进程A过程2、进程B过程五、demo1、进程A2、进程B六、输出......