2017-10-26 16 views
0

나는이 특정 교착 상태를 해결하기 위해 몇 가지 제안을 부탁드립니다 :여러 운영자가 3 가지 도구를 공유하고 교착 상태를 피하는 방법?

3 operators, each is given 2 of 3 different materials at random: 1, 2, 3 
3 tools, each material needs a different tool to process by an operator. 
    material 1 needs tool 1 
    material 2 needs tool 2 
    material 3 needs tool 3 
Each operator needs to wait for the proper tools to process the materials. 
i.e. If an operator has taken material 1,2, he needs tool 1,2 

교착 상태가 발생할 수 있습니다 : 두 도구를 얻을 수있는 연산자의

operator 1 has taken material 1,2, waiting for tool 1,2 
operator 2 has taken material 2,3, waiting for tool 2,3 
operator 3 has taken material 3,1, waiting for tool 3,1 

없음, 운전자가 무엇을해서는 안?

제안

운영자에 의해 촬영 최근 6 개 자료를 기록하는 전역 변수를 만듭니다. 각 재료가 두 번 나타난다면 (예제 [1,3,1,2,2,3]) 마지막 재료는 모든 재료가 두 번 나타나지 않을 때까지 마지막 재료를 버려야합니다 (예 : [1,3,1,2,2 , ])?

이 방법이 유용할까요? 3 개의 공구와 3 개의 재료로 10 명의 작업자가 있다면 어떻게 될까요? 어떤 제안이 도움이 될 것입니다.

+0

이것은 고전적인 "식당 철학자"문제에 대한 변형으로 보입니다. –

답변

0

그럼 어떻게 작동합니까? 운영자가 도구 중 하나를 사용하고 두 번째 도구를 사용하게됩니다. 두 번째 것이없는 경우. 첫 번째 도구를 다시 사용하게하고 첫 번째 도구를 다시 가져와 다른 운영자에게 무료로 제공합니다. 이렇게하면 해당 도구를 기다리는 다른 연산자가 작업을 수행하고 교착 상태가 발생하지 않습니다.

int toolx=0; // operator has no tool x 
    int tooly=0; // operator has no tool y 

    pthread_mutex_lock(&tool_mutex); 

    // loop if toolx and tooly are not aquired 
    while ((toolx + tooly)!=2){ 

     //drop tool x 
     if (toolx == 1) { 
      toolbox[mat_x] ++; 
      toolx -- ; 
      pthread_cond_signal(&cond_tool); 
     } 

     // drop tool y 
     if (tooly == 1) { 
      toolbox[mat_y] ++; 
      tooly -- ; 
      pthread_cond_signal(&cond_tool); 
     } 

     // wait on tool x 
     while (toolbox[mat_x] == 0) { 
      pthread_cond_wait (&cond_tool,&tool_mutex); // wait 
     } 

     // wait complete and take tool x 
     toolbox[mat_x] --; 
     toolx ++ ; 

     //try take tool y 
     while (toolbox[mat_y]== 0) { // if other is taking tool y 
      if (toolx == 1) { //if operator is holding toolx. 
       toolbox[mat_x] ++; 
       toolx -- ; // put back tool x 
       pthread_cond_signal(&cond_tool); 
      } 
      pthread_cond_wait (&cond_tool,&tool_mutex); // wait on tools 
     } 

     // take tool y 
     toolbox[mat_y] --; 
     tooly ++; 
    } 

    pthread_mutex_unlock(&tool_mutex);