2016-12-03 7 views
0

3 소비자 2 생산자. 하나의 버퍼 읽기 및 쓰기. 프로듀서 A가 1 요소를 버퍼 (길이 N)로 푸시하고 프로듀서 B가 2 요소를 버퍼로 푸시합니다. 활성 대기 없음. System V 세마포어를 사용할 수 없습니다. 생산자 A에 대한2 요소를 생성하는 생산자 - 소비자 생산자 POSIX 세마포어

샘플 코드 : 그들이 읽거나 소비를 제외하고

void producerA(){ 
    while(1){ 
    sem_wait(full); 
    sem_wait(mutex); 

    Data * newData = (Data*) malloc(sizeof(Data)); 
    newData->val = generateRandomletter(); 
    newData->A = false; 
    newData->B = false; 
    newData->C = false; 

    *((Data*) mem+tail) = *newData; 

    ++elements; 
    tail = (tail + 1) % N; 

    sem_post(mutex); 
    sem_post(empty); 
    } 
} 

소비자는 비슷하지만 무관합니다. 내가 프로듀서 B.에 문제가 많은 데 분명히 나는 ​​2 이상의 여유가있는

나는 또한 처음 올렸 될 것이다 생산자 B에 대해 다른 세마포어를 가지고 시도
sem_wait(full); sem_wait(full); 

등의 작업을 수행 할 수 없습니다 버퍼의 스팟들. 하지만 여전히 올바르게 세마포어를 낮추고 증가시켜야하기 때문에 제대로 작동하지 않았습니다 fullempty.

이 문제를 어떤 방법으로 해결할 수 있습니까?

+0

조건 변수는 내가 필요한 기술로 보입니다. –

+0

프로세스에서 대기중인 활성 상태를 가질 수 없으므로 루프의 모든 반복 조건을 검사 할 수 없습니다. 그리고 더 똑똑한 것을 마음에두면 고맙겠습니다. – Aaroneiros

+1

조건 변수의 전체 점은 활성 대기를 피하는 것입니다. –

답변

0

https://gist.github.com/RobPiwowarek/65cb9896c109699c70217ba014b9ed20 그게 내가 가진 전체 문제에 대한 해결책이 될 것입니다.

TLDR : I가 제공 할 수있는 가장 쉬운 동기화 I는 버퍼 가압 한 요소의 개수를 나타내는 세마포어에게 fullempty를 이용하여했다. 그러나 2 가지 요소를 생성하는 생산자가 있다면 POSIX 세마포어에 대한 그런 종류의 솔루션이 작동하지 않습니다.

내 솔루션은 다른 개념입니다. 나는 이것이 미래에 누군가에게 도움이 될 것입니다 희망

while(1){ 
    down(mutex); 
    size = get size 
    if (condition related to size based on what process this is) 
    { 
     do your job; 
     updateSize(int diff); // this can up() specific semaphores 
           // based on size 
           // each process has his own semaphore 
     up(mutex); 
    } 
    else 
    { 
     up(mutex); 
     down(process's own semaphore); 
     continue; 
    } 
} 

:
프로세스의 개요는 아래에 제공됩니다.