实验3进程同步
实验3进程同步一、实验目的1. 掌握信号通信机制,实现进程之间通过信号进行通信;2. 掌握共享内存、信号量通信实现方法。二、实验工具与设备装有Linux系统的计算机。三、实验内容1.使用fork创建进程,实现两个进程之间的通信,一个进程把一个变量的值加5,另一个进程输出该变量的值。参考代码:#include#include#include#in
实验3进程同步
一、实验目的
1. 掌握信号通信机制,实现进程之间通过信号进行通信;
2. 掌握共享内存、信号量通信实现方法。
二、实验工具与设备
装有Linux系统的计算机。
三、实验内容
1.使用fork创建进程,实现两个进程之间的通信,一个进程把一个变量的值加5,另一个进程输出该变量的值。
参考代码:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <sys/mman.h>
int* count ;
sem_t *mutex1 = NULL;
sem_t *mutex2 = NULL;
int i = 0;
int main()
{
mutex1 = (sem_t*)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);
mutex2 = (sem_t*)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);
count = (int*)mmap(NULL,sizeof(int), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1,0);
sem_init(mutex1, 1, 1);
sem_init(mutex2, 1, 0);
*count = 5;
if(fork()==0)
{
for(i=0;i<10;i++){
sem_wait(mutex1);
*count += 5;
printf("child:%d\n",*count);
sem_post(mutex2);
}
exit(0);
}
for(i=0;i<10;i++){
sem_wait(mutex2);
printf("father:%d\n",*count);
sem_post(mutex1);
}
sem_destroy(mutex1);
sem_destroy(mutex2);
munmap(mutex1, sizeof(sem_t));
munmap(mutex2, sizeof(sem_t));
munmap(count, sizeof(int));
return 0;
}
2 在linux下创建线程,实现线程的通信,一个线程把一个变量的值加5,另一个进程输出该变量的值。
参考代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
int c=5;
sem_t mux1;
sem_t mux2;
pthread_mutex_t mutex;
void * thread1(void *arg)
{
int i=0;
for(i=0; i<10; i++)
{
sem_wait(&mux1);
C=C+5;
sem_post(&mux2);
}
}
void * thread2(void *arg)
{
int i=0;
for(i=0; i<10; i++)
{
sem_wait(&mux2);
printf("c is %d\n",c);
sem_post(&mux1);
}
}
int main()
{
pthread_t th1;
pthread_t th2;
int ret=sem_init(&mux1,0,1);
if(ret!=0)
{
printf("sem_init error");
exit(0);
}
ret=sem_init(&mux2,0,0);
if(ret!=0)
{
printf("sem_init error");
exit(0);
}
pthread_create(&th1,NULL,thread1,NULL);//创建线程
pthread_create(&th2,NULL,thread2,NULL);
pthread_join(th1,NULL);//主线程等待子线程的终止
pthread_join(th2,NULL);
exit(0);
}
注意:因为semaphore, pthread并非Linux系统的默认库,编译时注意加上-lpthread参数,以调用链接库
四、实验总结
1.写出实验报告。
2.进程之间<semaphore.h>的,涉及的相关函数完成的主要功能。
sem_wait就是P操作,sem_post就是V操作
首先需要用sem_init(); 初始化sem_t型变量,并设置初始信号量。比如设置为1.
每次调用sem_wait(sem_t *); 信号量减1,当调用sem_post(sem_t *); 信号量加1。
当信号量为0时,sem_wait(); 函数阻塞,等待信号量 >0 时,才进行。
3.线程之间怎么通信的,涉及的相关函数完成的主要功能。
pthread_t它是一个线程的标识符。
函数pthread_create用来创建一个线程.
第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。
pthread_join()的作用:主线程等待子线程的终止。也就是在子线程调用了pthread_join()方法后面的代码,只有等到子线程结束了才能执行。
pthread_mutex_t mutex 用来生成互斥锁
在编译时注意加上-lpthread参数,以调用静态链接库。因为pthread并非Linux系统的默认库
更多推荐
所有评论(0)