2014-01-30 3 views
1

나는 거기에 아직 존재하지 않는다면 끊임없이 데이터를 목록으로 푸시하는 소비자 생산자 상황이있다. 데이터를 서버에 보냅니다.std :: unique_ptr을 std :: list 변수로 사용하는 방법

현재 스레드가 몇 초 동안 지연되고 깨어나서 플래그를 설정하여 목록에 아무 것도 추가되지 않고 패키징을 수행하고 목록에서 처리 된 항목을 삭제 한 다음 목록에 다시 추가 시작하십시오.

이것은 프로토 타입에서는 문제가되지 않았지만 이제는보다 현실적인 상황에서 더 잘 작동 할 필요가 있습니다.

그래서 제작자에게 정보를 얻고 싶습니다. 크기가 충분히 크거나 충분한 시간이 지나면 목록을 처리 할 스레드로 전달합니다.

목록에 대한 참조를 전달하려면 unique_ptr이 유용하므로 수동으로 생성자 스레드가 새로운 목록을 만들고 모든 실제 목적으로 이전과 같은 목록을 사용할 수 있습니다. 내가

std::unique_ptr<STRINGQUEUE> newMachineQueue; 

typedef list<string> STRINGQUEUE; 
STRINGQUEUE newMachineQueue; 

에서 내 목록을 변경하려고 할 때

는하지만 그 때 나는 insertstd::unique_ptr의 구성원이 아닌 오류가 있음을 얻는다.

newMachineQueue.get()을 사용하고 싶지 않고 다음으로 내 작업을 수행하고 싶습니다. unique_ptr의 이점을 잃어 버렸다고 생각합니다.

목록에 unique_ptr을 사용하고 목록의 메소드를 호출하려면 어떻게해야합니까?

답변

2

포인터를 사용하는 것처럼 사용하십시오.

newMachineQueue->insert(...); 

in the documentation.

unique_ptr도 사용할 필요는 없지만 목록을 이동하고 새 목록을 다시 할당하면됩니다.

void consumer(std::list<string> list) { 
    // accept by value! 
} 

std::list<string> machineQueue; 
// hand-off to consumer 
consumer(std::move(machineQueue)); 
machineQueue = std::list<string>{}; // new list 
+0

죄송합니다. newMachineQueue.insert를 사용했는데 현재 포인터가 아닙니다. –

+1

@JamesBlack 또한 'unique_ptr'없이 원하는 것을 수행하는 코드를 추가했습니다. – pmr

+0

당신의 편집은 unique_ptr로 스레드를 호출 할 때 이상한 오류가있어 다른 질문을 할 준비가되었습니다. 고맙습니다 –

관련 문제