일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 아펠가모선릉
- @Component
- http상태코드
- 400에러
- 코프링
- c# scv
- Srping AOP
- 스프링 AOP
- HTTP
- 아펠가모 선릉
- 그라나다
- 스페인
- git명령어
- 스페인 준비물
- 바르셀로나
- kotiln
- db index
- 코틀린
- kopring
- 본식후기
- 세비야
- 마드리드
- 아펠가모
- elk
- 코틀린 함수
- sprintboot
- 관심지향프로그래밍
- b-tree index
- HTTP #웹기술
- Kotlin
- Today
- Total
끄적이는 메모장
[C++11] mutex 본문
#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 |