[C/C++]std::mutex

2019. 1. 23. 13:25·Language/C C++
반응형

[C/C++]std::mutex

멀티 쓰레드를 이용한 프로그램을 작성할 때 공유 자원의 관리에 주의해야한다. 여러 쓰레드가 동시에 같은 데이터를 변경할 경우 의도하지 않은 결과를 초래할 수 있다. 이런 멀티 쓰레드 환경에서 발생하는 문제점을 동기화 메커니즘으로 해결할 수 있다.

먼저 동기화를 사용하지 않을 경우 발생하는 문제를 살펴보자.

#include <thread>    //std::thread
#include <cstdio>    //printf()

using namespace std;

int sum = 0;
void Add(int cnt)
{
    for (int i = 0; i < cnt; i++)
    {
        sum += 1;
    }
}

void Sub(int cnt)
{
    for (int i = 0; i < cnt; i++)
    {
        sum -= 1;
    }
}

int main()
{
    int cnt = 1000000;
    thread t1(Add, cnt);
    thread t2(Sub, cnt);

    t1.join();
    t2.join();

    printf("sum : %d\n", sum);
    return 0;
}

Add/Sub함수에서 for문을 순회하며 전역 변수 sum을 1씩 더하거나 뺀다. 이 함수들을 각각 쓰레드로 실행시켜 같은 횟수만큼 순회하도록 했다. 더하고 빼는 횟수가 같으므로 sum이 0이 되어야하지만 실행할 때마다 다른 값이 나오게 된다. 서로 다른 쓰레드에서 공통 변수 sum에 접근하여 값을 변경시키기 때문이다.

그림

따라서 공통 변수에 접근하는 부분을 제한하여 한번에 하나의 쓰레드만 들어올 수 있게 해줘야한다. C++에서 제공하는 std::mutex클래스를 사용한 코드이다.

#include <mutex>
int sum = 0;
mutex mtx;
void Add(int cnt)
{
    for (int i = 0; i < cnt; i++)
    {
        mtx.lock();
        sum += 1;
        mtx.unlock();
    }
}

void Sub(int cnt)
{
    for (int i = 0; i < cnt; i++)
    {
        mtx.lock();
        sum -= 1;
        mtx.unlock();
    }
}

뮤텍스로 lock을 호출한 후, unlock을 호출할 때까지는 다른 스레드는 대기를 하고, 락을 풀면 대기하고 있는 스레드 중 하나가 락을 건 후 공유 자원을 사용한다. 따라서 락을 건 후에는 꼭 락을 풀어야 하고, 락을 사용이 너무 빈번하면 쓰레드의 대기시간이 길어지기 때문에 병렬 프로그래밍의 장점이 약해진다. 따라서 적절한 부분에서 사용해야한다.

bool try_lock();

mutex 객체에는 try_lock()이라는 멤버함수도 있다. lock이 잠금 시도 후 unlock이 호출될 때 까지 대기하는 반면 try_lock()은 즉시 결과를 반환한다. 이를통해 lock을 얻지 못했을 경우의 다른 처리를 할 수 있도록 로직을 분리할 수 있다.

참고로 std::mutex는 Windows OS에서는 내부적으로 크리티컬섹션을 사용한다고 한다.

반응형
저작자표시 비영리 변경금지 (새창열림)
'Language/C C++' 카테고리의 다른 글
  • [C++] 클래스 생성자
  • [C++]inline 함수
  • [C/C++] 소켓 프로그래밍
  • [C/C++] const keyword
덴마크초코우유
덴마크초코우유
IT, 알고리즘, 프로그래밍 언어, 자료구조 등 정리
    반응형
  • 덴마크초코우유
    이것저것끄적
    덴마크초코우유
  • 전체
    오늘
    어제
    • 분류 전체보기 (124)
      • Spring Framework (10)
        • Spring (5)
        • JPA (3)
        • Spring Security (0)
      • Language (51)
        • Java (11)
        • Python (10)
        • JavaScript (5)
        • NUXT (2)
        • C C++ (15)
        • PHP (8)
      • DB (16)
        • MySQL (10)
        • Reids (3)
        • Memcached (2)
      • 개발 (3)
      • 프로젝트 (2)
      • Book (2)
      • PS (15)
        • 기타 (2)
        • 백준 (2)
        • 프로그래머스 (10)
      • 딥러닝 (8)
        • CUDA (0)
        • Pytorch (0)
        • 모델 (0)
        • 컴퓨터 비전 (4)
        • OpenCV (1)
      • 기타 (16)
        • 디자인패턴 (2)
        • UnrealEngine (8)
        • ubuntu (1)
        • node.js (1)
        • 블로그 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    FPS
    클래스
    알고리즘
    C++
    NUXT
    C
    Python
    웹
    Unreal
    프로그래머스
    딥러닝
    select
    pytorch
    CPP
    언리얼엔진4
    PS
    블루프린트
    map
    MySQL
    Unreal Engine
    파이썬
    mscoco
    JavaScript
    redis
    자바
    게임
    memcached
    JS
    php
    게임 개발
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
덴마크초코우유
[C/C++]std::mutex
상단으로

티스토리툴바