본문 바로가기
프로그래밍/언어_스크립트

오랜만에 C++ - 스레드 동기화(뮤텍스, 조건변수)

by 써드아이 2017. 9. 13.
* 뮤텍스
std::mutex        mtx;

mtx.lock();
mtx.unlock();


std::mutex        mtx;

std::lock_guard lg(mtx)


std::recursive_mutex mtx;
void ThreadFunc(int nID, int& nVal)
{
    for (int i = 0; i < 5; ++i)
    {
        std::lock_guard lg(mtx);
 
        std::cout << "Value of " << nID << " -> " << nVal << std::endl;
        ++nVal;
    }
}



* 조건변수 (스레드의 흐름제어)


std::condition_variable cv;

cv.wait()            // 인자로 unique_lock 뮤텍스를 넣는다.
                    //이중 검사를 위해 두번째 인자로 notify하는 곳에서 변경하는
                    // flag를 리턴하는 람다 함수를 넣을 있다.

    std::unique_lock<std::mutex> ul(readyMutex);
    cv.wait( ul, []{return readyflag;});


cv.notify_one() / cv.notify_all()
                    // 해당 조건 변수를 기다리고 있는 스레드중 무작위 한개를 깨우거나
                    // 모든 스레드를 깨우거나
                    // flag를 변경하기 위해서 lock_guard된 mutex로 lock을 사용


    {
        std::lock_guard<std::mutex> lg(readyMutex);
        readyflag = true;
    }
    cv.notify_all()



std::condition_variable cv;
std::mutex readyMutex;
                    // 위 두 변수를 사용

'프로그래밍 > 언어_스크립트' 카테고리의 다른 글

오랜만에 C++ -  (0) 2017.10.30
오랜만에 C++ - const, static, explicit, mutale  (0) 2017.09.11
오랜만에 C++ - 파일 처리  (0) 2017.09.10
오랜만에 C++ - chrono  (0) 2017.09.02
오랜만에 C++ - const의 위치  (0) 2017.09.02