1.临界资源
临界区: 访问临界资源的那段代码
原子操作 :访问的完整性
2.信号量
强调的是线程的顺序问题
信号量 //交通信号灯 //实现一种可以让线程间有序访问临界资源的方式。
信号量 --- 可以顺序操作一把锁
1.信号量的机制
1.信号量 --- 来描述 可使用的资源的个数
2.p操作 表示使用这个资源 资源个数减一
3.v操作 表示产生这个资源 资源个数加一
2.信号量的初始化:
功能:将已经定义好的信号量赋值
参数:sem 要初始化的信号量
pshared = 0;表示线程间使用信号量
pshared != 0;表示进程间使用信号量
value 信号量的初始值,一般无名信号量
都是二值信号量 ,0 1
0 表示红灯,进程暂停阻塞
1 表示绿灯,进程可以通过执行
返回值: 成功 : 0 失败 :-1
2.sem_wait 函数
功能:
判断当前sem信号量是否有资源可用。
如果sem有资源(==1),则申请该资源,程序继续运行
如果sem没有资源(==0),则线程阻塞等待,一旦有资源
则自动申请资源并继续运行程序。
注意:sem 申请资源后会自动执行 sem = sem - 1;
参数:sem 要判断的信号量资源
返回值:成功 0
失败 -1
3.sem_post函数
功能:
函数可以将指定的sem信号量资源释放
并默认执行,sem = sem+1;
线程在该函数上不会阻塞。
参数:sem 要释放资源的信号量
返回值:成功 0
失败 -1;
4.sem_destroy函数
功能:使用完毕将指定的信号量销毁
参数:sem要销毁的信号量
返回值:成功 0
失败 -1;
3.进程间的通信
1.古老的通信方式
管道:无名管道
有名管道
信号
2.IPC对象通信 system v BSD suse fedora karnel.org
消息队列
共享内存(*) //最高效
信号量集() //信号量
3.socket通信
网络通信
1.无名管道
功能:
创建一个管道
参数:
@pipefd //用来获取 管道的两端 //读端pipefd[0]
//写端pipefd[1]
返回值:
成功 0
失败 -1 && errno
管道的特点:
1.管道大小 65536字节 64k
2.管道操作特点
数据读走之后,认为就没了
//写端存在,读端也存在
管道如果为空,此时可以一直写,直到写满
//写端存在,读端不存在
此时,写操作,会导致管道破裂
SIGPIPE //这个信号会使得程序结束
//写端存在,读管道
可以读管道,但是管道中如果没有数据了,此时读操作 阻塞
//写端不存在,读管道
可以读管道,但是管道中如果没有数据了,此时读操作 不阻塞
管道的读写规则:
1.读端存在,写管道
管道空:可以写数据
管道满:会造成-->写阻塞
2.读端不存在,写管道
系统会给进程发一个信号SIGPIPE(管道破裂)
3.写端存在,读管道
管道空,读不到数据,
这时会造成读操作阻塞
4.写端不存在,读管道
如果管道中有数据,则读取这些数据!
如果没有数据,读操作不阻塞,立即返回!