끄적이는 메모장

[C++11] mutex 본문

C, C++, C#/C++ 공부

[C++11] mutex

밥보92 2018. 6. 1. 11:20
반응형

#mutex

 

std::mutex 란

멀티 스레딩 상에서 하나의 자원에 대해서 두 프로그램이 읽기/쓰기를 할 때 발생할 수 있는 동기화 문제를 막기위해 공통으로 사용하는 자원에 lock을 걸어주는 역할을 수행해준다.

 

몇가지 기능으로

lock() - thread가 lock을 얻어오기 위한 기능, lock을 얻을 때 까지 대기

try_lcok() - thread가 lock 점유를 시도하고 성공(true), 실패(false)를 바로 반환

unlock() - lock을 해제함

 

당연한 말이지만 lock()을 동시에 호출하면 데드락 상황이 발생할 가능성이 큼

 

ex)

static int count = 0;

 

int main()

{

    std::mutex m;

    std::thread t1([&] {

         for (int i=0; i<10; ++i)

         {

             m.lock();

             count++;

             m.unlock();

         }

    });

   

    std::thread t2([&] {

         for (int i=0; i<10; ++i)

         {

             m.lock();

             count++;

             m.unlock();

         }

    });

   

    t1.join();

    t2.join();

 

    ....

}

 

t1, t2에 대한 자원 점유가 보장 되면서 count의 증가는 순차적으로 일어나는 것이 보장될 수 있음

 

만약, 하나의 쓰레드에서 lock()을 걸고 unlock()을 하지 않는 경우 다른 쓰레드에서 무한정 lock()을 기다릴 수 있다. (주의)

 

이럴때 std::lock_guard의 사용이 해답이 될 수 있다.

 

#std::lock_gurad란, loack과 unlock을 자동으로 호출해주는 기능을 수행한다.

 

ex)

static int count = 0;

 

int main()

{

    std::mutex m;

    std::thread t1([&] {

         for (int i=0; i<10; ++i)

         {

             std::lock_guard<std::mutex> lock(m);

             count++;

         }

    });

   ....

}

 

mutext m에 대하여 lock_guard를 수행한 것이고 별도의 unlock을 생각하지 않아도 되기 때문에 편리하게 사용이 가능하다.

반응형

'C, C++, C# > C++ 공부' 카테고리의 다른 글

[C++11] std::make_pair / std::move / std::swap  (0) 2018.06.07
[C++11] std::enable_shared_from_this  (0) 2018.06.07
[C++11] std::bind, std::placeholder  (0) 2018.05.31
[C++11] lambda expression  (0) 2018.05.31
[C++11] range for loop  (0) 2018.05.30