2017-04-18 12 views
1

이 질문을하기 전에 나는 오래 동안 검색을하고 있었고 문제를 해결하는 방법을 찾을 수 없습니다. 나는 다섯 개의 실 (노동자)을 가지고 있는데,이 노동자들은 금을 채굴하고, 전위를 전진 해달라는 금을 거기로 내려 놓는다.하나의 스레드가 조건 변수를 기다리는 대신 뭔가를 만드는 방법

그리고 내 문제는 거기에 노동자가 금을 채굴 할 때 사용자가 충분한 금이 있는지 확인하기 위해 b를 입력 할 수 있으며 이것이 막사를 짓는 것이 사실인지 확인하는 것입니다.

근로자가 금을 채굴 할 때 잠을 2 초가 걸리므로 나는 pthread_cond_timedwait()을 사용합니다. 나는 병영 번호,지도상의 금과 전위적인 금을 저장하고있는 전역 변수를 가지고있다. 다음은 의사 코드이다.

void makeBarrack(size_t data) { 
    timespec waitTime = { 2, 0 }; 
    pthread_mutex_lock(&check_mutex); 
    while (wantBarrack) { 
     pthread_cond_timedwait(&condp, &gold_mutex, &waitTime); 
    } 
    std::cout << "Worker" << data << "is making barrack" << std::endl; 
    wantBarrack = false; 
    pthread_mutex_lock(&unload_mutex); 
    avantPost -= 100; 
    pthread_mutex_unlock(&unload_mutex); 
    barracks++; 

    pthread_mutex_unlock(&check_mutex); 
} 

void *work(void *data, char input) { 

    size_t thread_num = (size_t) data; 
    pthread_mutex_lock(&gold_mutex); 
    timespec waitTime = { 2, 0 }; 
    if ((input == 'B' || input == 'b') && avantPost >= 100) { 
     wantBarrack = true; 
     input = 0; 
    } else if ((input == 'B' || input == 'b') && avantPoste < 100) { 
     std::cout << "There is " << avantPoste << " gold" << std::endl; 
    } 
    while (wantBarrack) { 
     pthread_cond_timedwait(&condp, &gold_mutex, &waitTime); 
    } 
    makeBarrack(data); 
} 

I 소비자 생산자 같은 것을 만들려고 노력하지만 내 작업에서 내가 대신 내에 다른 스레드를 기다리는 일 (광산 금) 할 필요가있다.

기타 질문이 두 함수에서 같은 뮤텍스를 사용해야합니까?

P. 나는 멀티 스레딩에 초보자이며 잘못된 것이있는 경우 제 질문을 편집 할 수있는 좋은 사람이 될 것입니다.

+0

이 유형의 시뮬레이션을 수행하는 것은 스레드를 사용하지 않는 것이 더 쉽습니다. 스레드를 사용하려는 특별한 이유가 있습니까? 루프 (델타 시간)에 매회 진행되는 표준 (단일 스레드) 게임 루프가이 작업에 접근하는 나의 방법 일 것입니다. –

+0

네,하지만 스레드, 뮤텍스 및 조건 변수를 사용하는 방법을 배우기 위해 제 작업이 나에게 주어졌습니다. 스레드없이이 작업을 수행하는 방법을 알고 있습니다. –

+0

왜 스레드 풀을 사용하지 않고 끝내야합니까? –

답변

0

문제는 내가 단순한 if에서 cv를 사용할 수 있다는 것을 배웠습니다 .cv를 사용하는 주된 이유는 다른 스레드를 차단하지 않고 스레드를 차단할 수 있다는 것입니다 (cv에서 기다리는 동안 뮤텍스를 잠금 해제하고 있습니다). 그리고 조건을 완료했다는 신호를 보내면 스레드를 해제 (해제)하고 원하는 기능을 만들 준비가되었습니다. 내가 원하는 시간 동안 내 스레드를 차단할 수 있기 때문에 pthread_cond_timedwait() 을 사용하고 있습니다.