整形信号量的实现(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时,一直等待,不符合进程同步原则的让权等待

 

原文地址:https://www.cnblogs.com/nanfengnan/p/14928931.html