2010-07-06 6 views
0

스레드 된 버퍼를 시뮬레이트하기 위해 pthread 라이브러리를 사용하고 있습니다. 또한 한 번에 하나씩 중요한 섹션 변수에 액세스하는 솔루션으로 세마포를 사용하고 있습니다.셈플 및 스레드 사용에 대한 도움말

주요 문제는 제작자가 전체 버퍼를 채우고 있으며 소비자가 전체 버퍼를 비우는 것입니다. 이 코드가 맞습니까? 버퍼가 꽉 찼거나 비어 있기 전에 생산과 소비가 일어난다 고 가정하고있었습니다.

내 코드 및 모든 의견을 많이 도움이 될 것입니다, 네, 클래스입니다.

download main.cpp

는 funkohland.com/pthreads/log.txt에서 로그 파일을 볼 ...

void *Producer(void *threadid) 
{ 
    long tid; 
    tid = (long)threadid; 

    while (c < Cycles) //While stuff to buffer 
    {       
     pthread_mutex_lock(&lock);   
     while(size == BUFFER_SIZE) 
     { 
      pthread_cond_wait(&cond, &lock);  
     } 
    buffer [full] = rand(); 
    data << size+1 << ". Produce: " << buffer[full] << endl; 
    printBuffer(); 
    full = (full + 1) % BUFFER_SIZE; 
    size++; 
    pthread_cond_signal(&cond1); 
    pthread_mutex_unlock(&lock); 
    c++; 
    } 
    pthread_exit(NULL); 
} 

당신은 또한 모든 코드를 다운로드하거나 로그 파일을 볼 수 있습니다 사전에 감사합니다

+0

세마포어 대신 뮤텍스를 사용 하시겠습니까? –

답변

1

이것은 Mutexes의 잘 알려진 문제점입니다. 뮤텍스는 많은 사이클을 필요로하는 값 비싼 작업입니다. 뮤텍스를 잠금 해제하면 다른 스레드는 잠금을 종료하고 잠금을 얻는 TINY 기회를 갖게됩니다. 기본적으로 다른 스레드에게 실행 기회를주기 위해 뮤텍스에서 보내는 시간을 줄여야합니다. 기본적으로 뮤텍스가 실제로 필요한 코드 부분을 선택하고 뮤텍스를 잠그면 해당 변수 (및 그 이상)로 수행해야 할 작업을 모두 빠르게 수행 한 다음 잠금을 해제해야합니다.

+0

감사합니다, 많이 설명합니다 – Scott

0

먼저, 공유 변수 'c'및 'size'에 대한 액세스가 중요 섹션 내에서 이루어져야합니다. 잠금 장치와 잠금 해제 호출 사이의 차이입니다. 현재 적절한 잠금없이 'c'및 '크기'에 자유롭게 액세스하고 있습니다.

+0

이것은 내가 생각하지 못한 멋진 점입니다 ... 저는 C와 순환을 사용하여 영원히 반복하지 않았습니다. 크기는 ++입니다. 잠긴 부분에서? – Scott

0

Goz의 대답이있는 동안 가능한 해결책은 usleep(1) 또는 sched_yield()/(OS에 따라 다름) 중 하나를 사용하여 뮤텍스 외부의 스케줄러에 양보하는 것입니다.

또한 제작자가 rand()를 사용하기 때문에 약간의 차이는 있지만 새로운 객체를 삽입하는 데 시간이 많이 걸리는 I/O 또는 고급 알고리즘을 사용하는 경우 올바른 방법은 실제 제작을 수행하는 것입니다 unmutexed를 로컬 버퍼에 넣은 다음 mutex 만 새로 만든 객체를 큐에 삽입합니다.

+0

내 경험에 의하면 드물게 다른 스레드가 뮤텍스를 종료하고 잠금을 해제 할 충분한 시간을줍니다. 나는 진짜 해결책을 자물쇠에있는 많은 시간을 소비하는 것을 피하는 유지할 것이다! :) – Goz

+0

@ Goz :이 경우에는 많은 도움이됩니다. 뮤텍스 안에서 95 %의 시간을 보낸다. 이것은 뮤텍스가 여전히 잠겨있는 동안 대부분의 시간에 스케줄 될 것이라는 것을 의미합니다. 소비자가 뮤텍스에 도달하면 잠김, 수율, 프로듀서가 CPU 시간을 다시 얻음, 뮤텍스를 종료하고 다시 입력하고 제어권을 반환하며 소비자는 여전히 잠겨 있고 다시 수익을 얻습니다 ... 물론 스레드가 뮤텍스에서 보낸 시간을 ~ 50 % (아직 많이 남아 있습니다) 다른 이야기입니다. –

+0

고맙습니다. 솔루션을 구현했는데 스레드가 채워지고 비워지는 대신에 비틀어졌습니다. – Scott

관련 문제