프로그래밍/언어_스크립트

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

써드아이 2017. 9. 13. 18:15
* 뮤텍스
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;
                    // 위 두 변수를 사용