2015-02-01 2 views
2

두 개의 스레드가 있습니다. 둘 다 GPU와 대화 중입니다. 첫 번째 요소는 다른 요소를로드하는 데 사용됩니다. 첫 번째 것이 실제로 렌더링되고 다른 일을하지 않을 때 두 번째 것은 멈춰야합니다. 병렬로 실행할 수도 있지만 프레임 속도 스파이크가 도입됩니다. 따라서 스레드를로드하는 데 하나의 루프를 만드는 것이 좋지만 더 이상 수행하지 않아도됩니다. std :: mutex로이 동작을 구현했지만 두 번째 스레드가 실제로 뮤텍스를 토글하고 렌더링 스레드를 느리게 할 수 있기 때문에 나는 그것을 좋아하지 않습니다. 어떻게하면 더 깨끗한 방법으로 구현할 수 있습니까?std :: mutex를 검사하는 방법은 무엇입니까?

//Master thread 
{ 
    std::lock_guard<std::mutex> lg(gpuMutex); 
    // rendering 
} 

//Slave thread 
while(!toLoadQueue.isEmpty()) { 
    gpuMutex.lock(); 
    gpuMutex.unlock(); 
    // loading 
} 

편집 : 내 (파란색)과 배리의 (적색) 코드 @의 Comparison 비교. (스파이크가 적다)

Visualization 스레드가 어떻게 동작해야하는지 시각화.

// in master 
available = false; 
std::lock_guard<std::mutex> lock(gpuMutex); 
// [ do stuff ... ] 
// ok ready to let go 
available = true; 
cv.notify_one(); 

슬레이브 후 condition_variable에 불과 waitnotify 에드 수 :

답변

3

은 내가 condition_variableatomic<bool>가 사용할 수 있습니다. 가짜 웨이크 업을 피하기 위해 atomic<bool>에 추가합니다.

// in slave 
std::unique_lock<std::mutex> lock(gpuMutex); 
cv.wait(lock, [&]{ return available.load(); }); 
+0

글쎄, 정말 혼란 스럽네. 당신의 솔루션이 왜 그렇게 잘 작동하는지 아십니까? – Keo

+2

'available'이 원자적일 수있는 것은 비효율적입니다. 'gpuMutex'를 잠근 상태로 항상 읽고 쓰면서 일반 bool 일 수 있습니다. 그렇지 않으면, 나는 이것이 갈 길이 란 것에 동의한다. –

+0

@Keo 질문 인 경우 답변으로 게시할만한 이유를 분명히 말할 수 없습니다. 나는'condition_variable'이이 문제를 해결하도록 고안되었다고 생각합니다. – Barry

관련 문제