현재 두 개의 스레드에 생산자와 소비자가 있습니다. 생성자는 Deque 유형의 정적 컨테이너에 데이터를 삽입하고 boost::condition_variable
을 통해 소비자에게 deque 객체에 객체가 삽입되었음을 알리는 정적 메서드입니다. 그런 다음 소비자는 Deque 유형에서 데이터를 읽고이를 컨테이너에서 제거합니다. 두 스레드는 다음을 사용하여 통신합니다. boost::condition_variable
통신은 공통 데이터 구조를 통해 두 개의 스레드를 연결합니다. 디자인 문제
다음은 추상적 인 현상입니다. 이것은 이제 객체가 Deque
형식 개체에 삽입되는
//Static Method : This is the producer. Different classes add data to the container using this method
void C::Add_Data(obj a)
{
try
{
int a = MyContainer.size();
UpdateTextBoxA("Current Size is " + a);
UpdateTextBoxB("Running");
MyContainer.push_back(a);
condition_consumer.notify_one(); //This condition is static member
UpdateTextBoxB("Stopped");
}
catch (std::exception& e)
{
std::string err = e.what();
}
}//end method
//Consumer Method - Runs in a separate independent thread
void C::Read_Data()
{
while(true)
{
boost::mutex::scoped_lock lock(mutex_c);
while(MyContainer.size()!=0)
{
try
{
obj a = MyContainer.front();
....
....
....
MyContainer.pop_front();
}
catch (std::exception& e)
{
std::string err = e.what();
}
}
condition_consumer.wait(lock);
}
}//end method
가 매우 빠르다 소비자와 생산자의 코드는 약 500 second.While가 TextBoxB 내가있는 동안 "정지"항상 것을 나는 발견이 실행 객체 "Running"과 "Stoped"사이를 전환한다고 가정 해보십시오. 플러스 매우 느립니다. 내가 뭘 생각하고 잘못했을지도 모르는 것에 대한 제안? 당신은 뮤텍스에서 MyContainer.push_back(a);
을해야
답장을 보내 주셔서 감사합니다. 조건부 대기 문의'[&] {return! MyContainer.empty();} – MistyD
두 번째 매개 변수를 설명해 주시겠습니까? ; "나는 술어를 올바르게 이해하지 못하고있다. – MistyD
당신은 'while (MyContainer.empty()) condition_consumer.wait (lock);'을 사용해야합니다 ** while 루프 ** –