2013-01-31 5 views
0

게시자 스레드와 소비자 스레드가 있습니다. 그들은 std::stack<Data *>을 통해 데이터를 공유합니다. 게시자는 단순히 포인터를 push()하고 소비자는 단순히 포인터를 pop()하여 사용하고 delete를 호출합니다. 한 번에 하나의 스레드 만 게시하는 단일 스레드와 포인터를 사용하는 하나의 스레드가 있으므로 스택을 동기화 할 필요가 있습니까? 스택은 포인터 만 저장한다는 것을 명심하십시오. 데이터()가 완전히 생성 된 경우에만 게시자가 포인터를 누릅니다.게시자와 소비자 스레드간에 스택을 통한 데이터 공유

+0

예, 동기화해야합니다. 'push()'와'pop()'은 원 자성 연산이 아닙니다. – juanchopanza

답변

3

std 네임 스페이스에있는 const 컨테이너의 메서드에서 동기화하지 않으면 정의되지 않은 동작입니다.

push도 아니요 popstack의 기본 컨테이너에 const이 아닙니다. 따라서 두 스레드는 모두 stack의 기본 컨테이너 상태에 쓰고 있습니다.

그것에 대해 생각하는 방법은 두 가지 모두 최소한 stack의 요소 수를 헤아릴 필요가 있다는 것입니다. 하나는 증가시키고 다른 하나는 줄이려고합니다. 그것. (다른 문제가 있지만, 두 사람 모두 stack 상태로 쓰고 있음을 확신해야합니다.)

1

std::stack<Data*> 인스턴스는 하나 개 이상의 스레드로 동기화 접속 (pop()push() 통해)을 수정할 수 있지만 같은 하나의 스레드 만은 어느 하나의 요소에 작동 가능하지 그 안에 포함 된 구성 요소가 필요합니다 시각.

1

예, std::stack 클래스는 모든 작업이 원자이며이 push(), top()pop()가 인터리브 것, 가능하다는 것을 보장하지 않기 때문에, 스택에 대한 액세스를 동기화 할 필요가있다.

관련 문제