进程之间的同步与线程之间的同步比较

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sem:信号量指针
成功:0
举例
生产者--消费者问题
回忆下…..
main( ) {
int sa=0; ∕* int sb=n; ∕* int mutex=1; ∕* cobegin
producer( ) ; consumer( ); coend }
*∕ *∕
*∕
producer( )
{
{
while(生产未完成)
表 7.4 5 所需头文件
函数原型
函数传入值 函数返回值
sem _wa it ( ) 等函数语法要点
#include <pthread.h>
int sem_wait(sem_t *sem) int sem_trywait(sem_t *sem) int sem_post(sem_t *sem) int sem_getvalue(sem_t *sem) int sem_destroy(sem_t *sem)
表 7-4 4 所需头文件 函数原型
函数传入值
函数返回值
sem _in it ( ) 函数语法要点 #include <semaphore.h> int sem_init(sem_t *sem,int pshared,unsigned int value) sem:信号量指针 pshared:决定信号量能否在几个进程间共享。由于目前 Linux 还没有实现进程间共享信 号量,所以这个值只能够取 0,就表示这个信号量是当前进程的局部信号量 value:信号量初始化值 成功:0 出错:1
int sem_create(int key,int num) int sem_open(int key,int num) int init_sem(int sem_id, int num ,int init_value) int del_sem(int sem_id) int sem_p(int sem_id,int num) int sem_v(int sem_id,int num)
举例
生产者--消费者问题
回忆下…..
main( ) {
int sa=0; ∕* int sb=n; ∕* iΒιβλιοθήκη Baidut mutex=1; ∕* cobegin
producer( ) ; consumer( ); coend }
*∕ *∕
*∕
producer( )
{
{
while(生产未完成)
{

生产一个产品;
/* sem_com.h */
#ifndef
SEM_COM_H
#define
SEM_COM_H
#include <sys/ipc.h>
#include <sys/sem.h>
union semun
{ int val;
struct semid_ds *buf;
unsigned short *array;
量大于零时它们都能将信号量的值减一,两者的区 别在于若信号量小于零时,sem_wait()将会阻塞进程 ,而sem_trywait()则会立即返回。 • sem_post()相当于V操作,它将信号量的值加一同时 发出信号来唤醒等待的进程。 • sem_getvalue()用于得到信号量的值。 • sem_destroy()用于删除信号量。
#endif /* SEM_COM_H */
用进程实现
生产者: mutex=sem_create(key,1); full=sem_create(key,1); empty= sem_create(key,1)
消费者: mutex=sem_open(key,1); full=sem_open(key,1); empty= sem_open(key,1)
}
消费者结构
void producer(){……
sem_p(full); sem_p(mutex);
…………….
sem_v(mutex); sem_v(empty);
}
实验辅导
第4节 信号量与PV操作
有2种信号量: system v(进程用) posix(线程用)
相关函数
• sem_init()用于创建一个信号量,并初始化它的值。 • sem_wait()和sem_trywait()都相当于P操作,在信号
};
int sem_create(int,int); int sem_open(int,int); int init_sem(int, int,int); int sem_getval(int ,int ); int del_sem(int); int sem_p(int,int); int sem_v(int,int);
system v信号量
相关函数 程序设计
信号量的使用步骤
• 第一步:创建信号量或获得在系统已存在的信号量 • 第二步:初始化信号量 • 第三步:进行信号量的PV操作 • 第四步:如果不需要信号量,则从系统中删除它
创建信号量
设置信号量值
信号量的P、V操作
system v信号量
相关函数 程序设计
p(sb); p(mutex);
送一个产品到有界缓冲
v(mutex);
v(sa); }
}
}
consumer( )
while(还要继续消费) {
p(sa); p(mutex); 从有界缓冲区中取产品; v(empty);
v(sb); 消费一个产品;
}
system v PV操作
• 涉及内核数据,有点麻烦…… • 封装函数:见sem_com.h、sem_com.c
{

生产一个产品;
p(sb); p(mutex);
送一个产品到有界缓冲
v(mutex);
v(sa); }
}
}
consumer( )
while(还要继续消费) {
p(sa); p(mutex); 从有界缓冲区中取产品; v(empty);
v(sb); 消费一个产品;
}
用线程实现
sem_t mutex,full,empty;
init_sem(mutex, 0 ,1); init_sem(empty, 0 , BUFFER_SIZE) init_sem(full, 0 ,0)
生产者结构
void producer(){……
sem_p(empty); sem_p(mutex);
…………….
sem_v(mutex); sem_v(full);
相关文档
最新文档