zoukankan      html  css  js  c++  java
  • 整形信号量的实现(ubuntu下)

    //文件名:m1.c,编译方法:g++ m1.c -lpthread -o m1

    //线程创建参见:https://www.jianshu.com/p/224be0e24673

    //注意:执行线程的顺序总是不固定的,这取决于操作系统的调度算法(FCFS,SJB,高优先权调度,基于时间片轮转的算法,多级反馈队列...)

    #include <stdio.h>
    #include <string.h>
    #include <pthread.h> // 线程的头文件
    #include <stdlib.h>
    #include <unistd.h>
    //整形信号量实现
    int S=1; //资源S
    void wait(int &S)  //p操作
    {
            while(S<=0);   //当S<0,表示没有资源,进程/线程要等待,知道别的线程释放S资源,才能执行
            S=S-1;
    }
    void signal(int &S) //v操作
    {
            S+=1;  //释放资源
    }
    void *p1(void *p)  //定义线程函数p1
    {
            printf("p1 wait
    ");
            wait(S);
            signal(S);
            printf("p1释放了资源S
    ");
            return NULL;
    }
    void *p2(void *p2) //定义线程函数p2,格式就这样,不要修改
    {
            printf("p2 enter the criticl resource
    ");
            wait(S);
            signal(S);
            printf("p2释放了资源S
    ");
            return NULL;
    }
    int main(void)
    {       pthread_t a1,a2;  //创建pthread_t变量,用来记录线程的返回值
            int a = pthread_create(&a1,NULL,&p1,NULL);
            //创建一个线程,
        /* 参数:四个参数,写不下了,分两行了
         * pthread_t变量的地址,NULL,要设置为线程的函数(注:进程相当于程序,线程相当于程序中的一个函数),
         * 给线程函数传递的参数地址(用指针类型,因为可能传递多个参>数)
         */
            int b = pthread_create(&a2,NULL,&p2,NULL);
            sleep(2);//调用系统函数,休眠
            return 0;
    }

     执行结果:分析,因为线程执行顺序随机,所以,p1,p2执行顺序可能不同

     这里仅给出了:整形信号量的基本操作,没给出具体例子,主要是因为,整形信号量没有人用了.

     整形信号量:简介

     整形信号量的典型应用:缺点,一次只能操作一个资源,并且S<0时,一直等待,不符合进程同步原则的让权等待

     

  • 相关阅读:
    并行数据的并行转串行
    色彩空间转换仿真与模型搭建
    布隆过滤器介绍和在java中应用举例
    java9初探
    个人博客开通啦!
    MyBatis多租户隔离插件开发
    手动解析Excel获取文件元数据
    解决Shiro+SpringBoot自定义Filter不生效问题
    基于Redis的分布式锁实现
    解决tomcat同时部署两个SpringBoot应用提示InstanceAlreadyExistsException
  • 原文地址:https://www.cnblogs.com/nanfengnan/p/14928931.html
Copyright © 2011-2022 走看看