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