두 개의 스레드가 있습니다. 둘 다 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
}
편집 : 내 (파란색)과 배리의 (적색) 코드 @의 비교. (스파이크가 적다)
스레드가 어떻게 동작해야하는지 시각화.
// 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
에 불과 wait
들 notify
에드 수 :
글쎄, 정말 혼란 스럽네. 당신의 솔루션이 왜 그렇게 잘 작동하는지 아십니까? – Keo
'available'이 원자적일 수있는 것은 비효율적입니다. 'gpuMutex'를 잠근 상태로 항상 읽고 쓰면서 일반 bool 일 수 있습니다. 그렇지 않으면, 나는 이것이 갈 길이 란 것에 동의한다. –
@Keo 질문 인 경우 답변으로 게시할만한 이유를 분명히 말할 수 없습니다. 나는'condition_variable'이이 문제를 해결하도록 고안되었다고 생각합니다. – Barry