일반적인 프로세스 간 통신 IPC 문제 - 생산자 소비자 문제

본 실례는 생산자 소비자 문제의 간이 모델을 상세하게 설명하고 동기화 상호 배제와 다중 라인 처리에 대해 비교적 좋은 해결 방안을 제시했다.
#include <stdio.h>
#include <pthread.h>
#define MAX 10000000000 //       ,       
pthread_mutex_t  the_mutex;
pthread_cond_t  condc,condp;
int buffer=0;

void *product(void *ptr)
{
    int i;
    for(i=1;i<MAX;++i)
    {
        pthread_mutex_lock(&the_mutex);//       
        while(buffer!=0)
            pthread_cond_wait(&condp,&the_mutex);
        buffer=i;//       
        pthread_cond_signal(&condc);//     
        pthread_mutex_unlock(&the_mutex);//     
    }
    pthread_exit;
}

void *consumer(void *ptr)
{
    int i;
    for(i=1;i<MAX;++i)
    {
        pthread_mutex_lock(&the_mutex);//    
        while(buffer==0)
            pthread_cond_wait(&condc,&the_mutex);
        buffer=0;
        pthread_cond_signal(&condp);//       
        pthread_mutex_unlock(&the_mutex);
    }
    pthread_exit(0);

}
int main(int argc,char ** argv)
{
    pthread_t  pro,con;
    pthread_mutex_init(&the_mutex,0);
    pthread_cond_init(&condp,0);
    pthread_cond_init(&condc,0);
    pthread_create(&con,0,consumer,0);
    pthread_create(&pro,0,product,0);
    pthread_join(pro,0);
    pthread_join(con,0);
    pthread_cond_destroy(&condc);
    pthread_cond_destroy(&condp);
    pthread_mutex_destroy(&the_mutex);
}

main 함수에는 스레드 처리 문제를 처리할 때의 기본 조작이 포함되어 있으며, 스레드 생성, 상호 배율 성명, 스레드 등록의 기본 API 함수를 포함한다.이 실례는 제12장 스레드 제어를 참고할 수 있다.
4
  • 그러나 이런 모델은 자물쇠가 사라지는 현상이 크게 발생할 수 있다.자물쇠가 사라지는 네 가지 조건은
    4
  • 상호 배척 조건을 형성한다.모든 자원은 이미 하나의 프로세스를 분배했거나 사용할 수 있다

  • 4
  • 점유와 대기 조건.이미 어떤 자원을 얻은 프로세스가 새로운 자원을 요청할 수 있습니다

  • 4
  • 선점 불가 조건은 이미 한 프로세스에 분배된 자원을 강제로 선점할 수 없다는 것이다. 그는 그의 프로세스에 의해 주동적으로 석방될 수밖에 없다. 4
  • 4
  • 순환 도로 대기 조건은 자물쇠가 사라질 때 시스템은 반드시 하나 또는 두 개 이상의 프로세스로 구성된 순환 도로 하나가 순환하여 자원을 기다리고 있다.하지만 자원을 방출하지 않았다.

  • 4
  • 사라진 자물쇠가 발생하는 것은 네 가지 조건이 모두 만족할 것이다.만약 어떤 조건도 성립되지 않는다면, 사라진 자물쇠도 발생하지 않을 것이다


  • 사라진 자물쇠는 어떻게 피할 수 있습니까?마찬가지로 네 가지 방법이 있다. - 이 문제를 소홀히 한다. 만약 네가 그를 소홀히 한다면 그도 너를 소홀히 할 것이다. 유명한 타조 알고리즘이 아니다.그러나 이런 생각은 바로 죽은 자물쇠를 검측하고 회복하며 죽은 자물쇠가 발생했는지 검측하고 일단 발생하면 조치를 취해 구제하고 양을 잃고 외양간을 고치는 것이다.자원을 꼼꼼히 분배하여 동적 잠금을 피한다.-사라진 자물쇠를 파괴하는 네 가지 필요조건, 임의의 조건이 충족되지 않으면 사라진 자물쇠는 발생하지 않는다.
    스케줄이 뭐예요? -하나의 파이프라인은 과정, 변수, 그리고 데이터 구조로 구성된 집합이다.그들은 특수한 모듈과 소프트웨어 패키지를 구성하여 프로그램은 임의의 시간에 파이프라인 중의 과정을 호출할 수 있지만 파이프라인 이외의 성명 과정에서 파이프라인 중의 데이터 구조를 직접 사용할 수 없다.또한 루틴은 개념 언어이고 C 언어는 루틴을 지원하지 않는다.
    monitor example
        integer i;
        condition c;
        produce producer();
    
    
        end;
        producer  consumer();
    end monitor;

    다음은 자바로 프로그램 관리 방식을 실현하는 생산자 소비자의 문제이다. 말하자면 사실은 하나의 보조류를 채택한 것이다.
    public class ProducerConsumer{
        static final int N=100;
        static producer p=new producer();
        static consumer c=new consumer();
        static our_monitor mon =new our_monitor();//      
        public static void main (String args[]){
            p.start();
            c.start();
        }
        static class producer extend Thread {
            public  void run(){
                int item;
                while(true){
                    item=produce_item();
                    mon.insert(item);
                }
            }
            private int produce_item(){//     。。。}
        }
        static class consumer extend Thread{
            public void run(){
                int item ;
                while(true){
                    item=mon.remove();
                    consumer_item(item);
                }
            }
            private void consumer_item(int item){//  。。。。}
        }
    
        static class our_monitor{
            private int buffer[]=new int[N];
            private int count=0,io=0,hi=0;//      
            public synchronized void insert (int val){
                if(count==N) 
                    go_to_sleep();
                buffer[hi]=val;
                hi=(hi+1)%N;
                count++;
                if(count==1)
                    notify();
            }
            public synchronized int remove(){
                int val;
                if(count==0)
                    go_to_sleep();
                val=buffer[io];
                io=(io+1)%N;
                count--;
                if(count=N-1)
                    notify();//        ,     
                return val;
            }
            private void go_to_sleep(){
                try{
                    wait();
                }
                catch(interruptedException exc){}
            }
        }
    }

    좋은 웹페이지 즐겨찾기