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时,一直等待,不符合进程同步原则的让权等待

     

  • 相关阅读:
    HDU 2159 FATE【二维多重背包】
    HDU 1203 I NEED A OFFER!【01背包】
    HDU 1171 Big Event in HDU【多重背包】
    HDU 2844 Coins【多重背包】
    POJ 1014 Dividing【多重背包+二进制优化】
    HDU 2191 悼念512【多重背包+二进制优化】
    HDU 2602 Bone Collector【01背包】
    POJ 2060 Taxi Cab Scheme【最小路径覆盖】
    0828
    BZOJ2783: [JLOI2012]树
  • 原文地址:https://www.cnblogs.com/nanfengnan/p/14928931.html
Copyright © 2011-2022 走看看