2016-08-26 5 views
0

세 개의 스레드를 실행하는 응용 프로그램이 있습니다. 세 개의 스레드 모두 전역 변수의 상태에 따라 일부 작업을 수행합니다. 스레드 중 2 개가 동일한 코드를 실행하고 1 개의 스레드가 다른 코드를 실행 중입니다.다중 스레드 환경에서 전역 데이터 동작, C++

예는 : 응용 프로그램이 시작된 후

글로벌 변수의

초기 값으로 인해 gGlobalVarLock의 초기화 거짓 값으로,

gGlobalVarLock = false; 

thread 1: 
while(true == gGlobalVarLock) 
{ 
    /*wait for flag to become false*/ 
} 
/*after the flag becomes false*/  
{ 
    mutex.lock(); 
    gGlobalVarLock = true; 

    /*run some code*/ 

    gGlobalVarLock = false; 
    mutex.unlock(); 
} 

thread 2 and 3,  
while(true == gGlobalVarLock) 
{ 
    /*wait for flag to become false*/ 
} 
/*after the flag becomes false*/ 
{ 
    mutex.lock(); 
    gGlobalVarLock = true; 

    /*run some other code*/ 

    gGlobalVarLock = false; 
    mutex.unlock(); 
} 

이제 거짓, 스레드 중 하나가 실행을 시작하고는 락 실행중인 다른 스레드. 내 이해에 따라 위의 구현은 어떻게 든 gGlobalVarLock이 실행 스레드에 의해 잠겨 있는지 확인하고 특정 스레드에 대한 mutex.lock() 아래의 코드가 실행되면 다른 스레드가 해당 스레드에 액세스하지 못하도록합니다. 그것은 또한 잠금 아래에 전역 변수를 잠그고있는 것 같습니다. 하지만 어떻게해야할지 모르겠다.

내 코드가 정상적으로 작동하는 것 같습니다. 하지만 나는 의심의 여지가있다. 뮤텍스는 스레드 2와 3에 대한 코드를 잠그기 때문에이 두 스레드는 동일한 코드를 사용하기 때문에 실행됩니다. 그러나 코드 1을 실행중인 스레드 1의 경우 잠금은 어떻게 작동합니까? 해당 스레드의 mutex.lock()은 mutex.lock()에서 코드를 실행할 때 다른 스레드에 대해 gGlobalVarLock이 잠겨 있는지 확인합니다. 해당 뮤텍스가 gGlobalVarLock이 다른 코드 일부를 실행하는 다른 스레드로 변경되지 않도록 보장합니까? 내 이해 mutex.lock() 다른 스레드에 의해 사용되는 일반적인 코드를 잠급니다. 그렇다면 다른 스레드가 다른 코드를 실행하는 경우 내 전역 변수가 어떻게 잠기는 지 확인하십시오.

mutex.lock()은 다중 스레드 환경에서 전역 변수를 잠급 시킵니까?

+0

도중에 뮤텍스 유형을 보거나 말하지 않았습니다. –

+0

이 스레드를 가지고 내 응용 프로그램에서 전역 뮤텍스 – Sushant

답변

0

mutex는 lock() 다음에 뮤텍스를 획득 한 스레드가 unlock() 호출에 도달 할 때까지 코드를 실행할 수 있음을 보증합니다. 매우 느린 코드가 아니라면, 동시에 실행되고 있다고 생각할 수 있습니다. 그러나 lock()unlock() 사이의 코드 블록은 매번 단 하나의 스레드에 의해 실행될 것입니다.

1

점이다 정확하게 당신이 부모 프로세스에서 뮤텍스 객체를 만들고 여러 스레드 사이를 공유하는 경우,이 오브젝트의 메모리 (사람들은 공정하지 않습니다)

가 대신 프로세스를 만들어야합니다 스레드에 의해 공유되어 있는지 (fork() 사용) 메모리가 복사되고 작동하지 않습니다.

하지만 스레드 간에는 메모리가 공유되므로 개체가 공유됩니다. 모든 스레드에 대해 메모리에 mutex이라는 단일 인스턴스가 있습니다.

이 개체를 사용하면 lockunlock의 호출 사이에있는 중요 섹션에 한 번에 하나의 스레드 만 액세스 할 수 있습니다.

간단히 말해서 코드는 정상입니다.

+0

당신은 공유 리소스/메모리 사이에만 뮤텍스에 의해 잠겨 의미합니까? – Sushant

+0

아니요, 메모리가 스레드에 의해 공유됩니다 (또는 사용자의 부울에 액세스 할 수 없거나 값이 변경되는 것을 참조하십시오). 뮤텍스 객체는 OS 레벨에서 제외 메카니즘으로 보호됩니다. –

+0

뮤텍스만으로 메모리를 보호합니까? – Sushant

0

뮤텍스는 변수를 잠그지 않으며 잠금 만합니다. 뮤텍스 뒤에있는 변수에 대한 액세스를 제한함으로써 은 해당 변수를 보호 할 수 있지만 변수가 전역 인 경우 실수로 뮤텍스를 거치지 않고 코드에 액세스 할 수 있다는 보장이 없습니다.

예를 들어, 코드에서 전역 변수에 이미 액세스하고 false가 될 때까지 아무도 뮤텍스를 사용하지 않습니다.따라서 3 개의 스레드 모두가 뮤텍스 잠금을 위해 경쟁 할 가능성이 있습니다.

예제에서 전역 변수는 중복 된 것처럼 보입니다. 뮤텍스에 대한 액세스를 보호하기 위해 필터로 사용하는 것 같습니다.

뮤텍스와 함께 사용할 조건 변수를 찾고있을 수 있습니다.

관련 문제