请帮忙解释一下计算机操作系统中的P.V原语操作,还有它的工作原理

请帮忙解释一下计算机操作系统中的P.V原语操作,还有它的工作原理,第1张

SEM是一个入口参数

P原语: V原语:

SEM=SEM-1 SEM=SEM+1

然后看SEM>=0吗? 然后看SEM<=0吗?

如果大于就返回! 如果大于就返回

如果小于就 如果小于就唤醒等待队列中的

进调用进程入等待队列 一个进程

然后在转进程调度然后在返回或转进程调度

给你个例子计算机计算东西!然后在打印机的!当计算机计算完东西!将东西放出缓存打印机才可以把那东西打印了!当打印机机打印好了!将缓存的东西拿了!(弄出一个空的)计算机才将计算的东西放进去缓存中

设a=1是PA的私有量 b=0是PB的私有量

PA(计算机)PB(打印机)

计算 P(b)

P(a) Buf里面数取出来一个

V(b) 数据送打印机

GOTO AGOTO B

#include<stdio.h>

#include<pthread.h>

#include<unistd.h>

#include<fcntl.h>

#include<sys/stat.h>

#include<sys/types.h>

#include<semaphore.h>

#include<stdlib.h>

#define N 3

pthread_mutex_t mutex_w,mutex_r// 定义读写互斥锁

sem_t sem_w,sem_r//定义读写信号量

int data[N]

int pos=0

void *function_w(void *arg)

{

int w = *(int *)arg

pos = w

while(1)

{

usleep(100000)

sem_wait(&sem_w)//等待可写的资源

pthread_mutex_lock(&mutex_w)//禁止别的线程写此资源

data[pos] = w

w++

w++

w++

pos++

pos=pos%N

pthread_mutex_unlock(&mutex_w)//别的线程可写此资源

sem_post(&sem_r)// 释放一个读资源

}

return (void *)0

}

void *function_r(void *arg)

{

while(1)

{

sem_wait(&sem_r)//等待可读的资源

pthread_mutex_lock(&mutex_r)//禁止别的线程读此资源

printf("%d\n",data[(pos+N-1)%N])

pthread_mutex_unlock(&mutex_r)//别的线程可读此资源

sem_post(&sem_w)// 释放一个写资源

}

return (void *)0

}

int main(int argc, char **argv)

{

pthread_t thread[2*N]

int i

pthread_mutex_init(&mutex_w,NULL)

pthread_mutex_init(&mutex_r,NULL)

sem_init(&sem_w,0,N)

sem_init(&sem_r,0,0)

for(i=0i<Ni++)

{

if ( pthread_create(&thread[i],NULL,function_w,(void *)&i) <0)//创建写线程

{

perror("pthread_create")

exit(-1)

}

}

for(i=Ni<2*Ni++)

{

if ( pthread_create(&thread[i],NULL,function_r,NULL) <0)//创建读线程

{

perror("pthread_create")

exit(-1)

}

}

sleep(1)

return(0)

}


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/285736.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-22
下一篇2023-04-22

发表评论

登录后才能评论

评论列表(0条)

    保存