Parallel Patterns Library(PPL) - concurrent_queue - 1
VC++ 10 Concurrency Runtime 2009. 12. 18. 09:00concurrent_queue는 queue
자료구조와 같이 앞과 뒤에서 접근할 수 있습니다.
concurrent_queue는 스레드 세이프하게 enqueue와 dequeue(queue에 데이터를 넣고 빼는) 조작을 할 수 있습니다.
또 concurrent_queue는 반복자를 지원하지만 이것은 스레드 세이프 하지 않습니다.
concurrent_queue와 queue의 차이점
concurrent_queue와 queue는 서로 아주 비슷하지만 다음과 같은 다른 점이 있습니다.
- concurrent_queue는 enqueue와 dequeue 조작이 스레드 세이프 하다.
- concurrent_queue는 반복자를 지원하지만 이것은 스레드 세이프 하지 않다.
- concurrent_queue는
front와 pop 함수를 지원하지 않는다.
대신에 try_pop 함수를 대신해서 사용한다.
- concurrent_queue는
back 함수를 지원하지 않는다.
그러므로 마지막 요소를 참조하는 것은 불가능하다.
- concurrent_queue는
size 메소드 대신 unsafe_size 함수를 지원한다.
unsafe_size는 이름 그대로 스레드 세이프 하지 않다.
스레드 세이프한 concurrent_queue의 함수
concurrent_queue에 enqueue 또는 dequeue 하는 모든 조작에 대해서는 스레드 세이프합니다.
- empty
- push
- get_allocator
- try_pop
empty는 스레드 세이프하지만 empty 호출 후 반환되기 전에 다른 스레드에 의해서 queue가 작아지던가 커지는 경우 이 동작들이 끝난 후에 empty의 결과가 반환됩니다.
스레드 세이프 하지 않은 concurrent_queue의 함수
- clear
- unsafe_end
- unsafe_begin
- unsafe_size
반복자 지원
앞서 이야기 했듯이 concurrent_queue는 반복자를 지원하지만 이것은 스레드 세이프 하지 않습니다. 그래서 이것은 디버깅 할 때만 사용할 것을 추천합니다.
또 concurrent_queue의 반복자는 오직 앞으로만 순회할 수 있습니다.
concurrent_queue는 아래의 반복자를 지원합니다.
- operator++
- operator*
- operator->
concurrent_queue는 앞서 설명한 concurrent_vector와 같이 스레드 세이프한 컨테이너지만 STL의 vector와 deque에는 없는 제약 사항도 있습니다. 우리들이 Vector와 deque를 스레드 세이프하게 래핑하는 것보다는 Concurrency Runtime에서 제공하는 컨테이너가 성능적으로 더 좋지만 모든 동작이 스레드 세이프하지 않고 지원하지 않는 것도 있으니 조심해서 사용해야 합니다.
다음에는 일반적인 queue에는 없고 concurrent_queue에서만 새로 생긴 함수에 대해서 좀 더 자세하게 설명하겠습니다.
ps : 앞 주에 Intel의 TBB에 대한 책을 보았습니다. 전체적으로 Concurrency Runtime과 비슷한 부분이 많아서 책을 생각 외로 빨리 볼 수 있었습니다. 제 생각에 TBB나 Concurrency Runtime를 공부하면 다른 하나도 아주 빠르고 쉽게 습득할 수 있을 것 같습니다.
'VC++ 10 Concurrency Runtime' 카테고리의 다른 글
Concurrency Runtime(ConcRT)의 디버그 모드에서 메모리 leak 문제 (5) | 2010.04.19 |
---|---|
Parallel Patterns Library(PPL) - concurrent_queue - 2 (2) | 2010.01.16 |
Parallel Patterns Library(PPL) - concurrent_vector - 2 (2) | 2009.12.09 |
Parallel Patterns Library(PPL) - concurrent_vector - 1 (0) | 2009.11.29 |
Parallel Patterns Library(PPL) - task group에서의 병렬 작업 취소 - 2 (0) | 2009.11.16 |