광고


[TBB] concurrent_vector Intel TBB





1. 주요 특징
  • 원소의 추가, [] 오퍼레이터와 at 메써드를 통한 랜덤 액세스, iterator 액세스, 이터레이션쓰레드 세이프하다.
  • 원소의 추가는 push_back으로만 가능할 뿐, insert 메써드는 제공되지 않는다.
  • 원소의 추가 작업에 move semantics는 적용되지 않는다. 즉 copy 메커니즘만!
  • 소를 연속된 메모리 공간에 저장하지 않기에, &v[0] + 2와 같은 연산이 불가능하다.

  • erase(), pop_back() 메써드를 제공하지 않아 개별 원소를 삭제하는 것이 불가능하다.
  • 따라서, clear()를 이용해 한번에 모두 지워야 하는데, 이 역시 쓰레드 세이프하지 않다.

  • resize()는 쓰레드 세이프하지 않지만, 이와 유사한 기능을 하는 grow_by()와 grow_to_at_least()는 쓰레드 세이프하다.

뭐, 아니 개별 원소를 삭제할 수 없는 vector라니, 이것을 어디에 써먹어야 되나 싶다.
당장은 생각을 해 보아도, 이 녀석을 어디에 쓰는 게 좋을 지 아이디어가 떠오르지 않는다.
뭐 이따구로 만들어 놨어~ ㅋ

아래 표는 concurrent_vector 주요 함수들의 쓰레드 세이프 여부에 대해 정리한 것이다.

메서드

 thread_safe

메서드 

 thread_safe

 메서드 

 thread_safe

at

O

end

O

operator[]

O

begin

O

front

O

push_back

O

back

O

grow_by

O

rbegin

O

capacity

O

grow_to_at_least

O

rend 

O

empty

O

max_size

O

 size

O

assign

X

reserve

X

clear

X

resize

X

operator=

X

shrink_to_fit 

X



2. 샘플 코드

  1. #include <iostream>
  2. #include <tbb/parallel_for.h>
  3. #include <tbb/concurrent_vector.h>
  4.  
  5. int _tmain(int argc, _TCHAR* argv[])
  6. {
  7.     tbb::concurrent_vector<int> vector;
  8.  
  9.     // 멀티쓰레드 환경에서의 삽입 테스트를 위해 parallel_for 사용
  10.     tbb::parallel_for(020[&] (int i)
  11.     {
  12.         vector.push_back(i);
  13.     });
  14.  
  15.     return 0;
  16. }


핑백

덧글

  • abc 2016/01/06 20:52 # 삭제 답글

    좋은 정보 감사합니다.
    operator[] 이 thread-safe하다고 하는데

    vector1[3] = new_obj; 와 같은 코드도 thread-safe한건가요?

    tbb source의 주석상으로는 "This method is thread-safe for concurrent reads" 라고 되어 있어서요~
  • 수까락 2016/01/08 01:45 #

    아닙니다. read일 경우만 thread-safe 합니다.
    말씀하신 것은 operator = 에 영향을 받기에 thread-safe 하지 않습니다.
  • abc 2016/01/15 10:36 # 삭제 답글

    네 감사합니다 ^^
  • 정승민 2016/11/08 16:13 # 삭제 답글

    도대체 개별은 그렇다 치더라도 clear 마저 지원안되면... 어디다 써먹어야 되는지.. 답도 없다.




댓글 입력 영역