实验3进程同步

来源:互联网 发布:idea打印不出sql 编辑:程序博客网 时间:2024/06/06 20:26

实验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系统的默认库