프로그래밍/c++

[c++14] shared_mutex와 shared_lock의 사용

제페 2015. 3. 24. 12:52
반응형

c++14에서 추가된 shared_mutex와 shared_lock_guard는 리더즈-라이터 락(Readers-Writer Lock)이다.(리더즈 라이터 락?)

컨테이너에 데이터를 추가할 땐 일반적인 lock_guard를 사용하고, 컨테이너에 있는 데이터를 사용하기만 할 때에는 shared_lock_guard를 사용한다.


사용 예를 보자


컨테이너에 데이터를 추가할 때 일반적인 lock_guard를 사용하는 모습이다.

1
2
3
4
5
6
7
8
9
 
        void add_thread(thread* thrd)
        {
            if(thrd)
            {
                boost::lock_guard<shared_mutex> guard(m);
                threads.push_back(thrd);
            }
        }



컨테이너를 순환하며 어떤 함수를 호출하는 과정에서는 shared_lock을 사용했다.

1
2
3
4
5
6
7
8
9
10
11
12
        void join_all()
        {
            boost::shared_lock<shared_mutex> guard(m);
 
            for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
                it!=end;
                ++it)
            {
              if ((*it)->joinable())
                (*it)->join();
            }
        }



단순히 데이터를 쿼리하는 함수에서도 shared_lock을 사용.

1
2
3
4
5
        size_t size() const
        {
            boost::shared_lock<shared_mutex> guard(m);
            return threads.size();
        }



지금 예제 코드에는 boost의 shared_lock을 사용하긴 했지만 c++14에는 표준 라이브러리에 추가되었다.

(VS2013의 표준 라이브러리엔 shared_lock이 없다.)

반응형