2011-04-09 5 views
7

이것에 약간의 명확성을 원합니다. EnterCriticalSection의 Windows API를 사용한다고 가정 해 보겠습니다. I는 EnterCriticalSection(&criticalsection);중요한 섹션은 무엇입니까?

함께 이것은 스레드 함수를 모두 호출 멀티 스레드가 임계 (1 부), 다른 스레드 여부 이상의 데이터 (1)에 관계없이 그 부분을 입력 할 수 들어가면

void thread(){ 

//enter critical section (part 1) 
data 
//leave critical section 
///more data 1 
//entercritical section (part 2) 
//more data 2 
//leave critical section 

} 

스레드 실제로 모든 공유 데이터가 있거나 그렇지 않은가? 또한 그 시간 동안 다른 스레드는 임계 영역의 파트 2에도 입력 할 수 없습니다.

+0

한스 - 사실이 아닙니다. Jake는 CriticalSection1에 속한 프로세스가 CS1과 CS2를 모두 잠그는 지 물어 보았습니다. 거짓 섹션 - 중요 섹션은 독립적입니다. Jake, CS1이 둘 다 잠 그길 원한다면 CS1을 CS1에 포함시킬 수 있습니다. – Greg

답변

8

중요 섹션은 코드 청크입니다. 임의의 스레드가 그것을 입력하면, 자유 스레드가 될 때까지 다른 스레드는 들어갈 수 없습니다. 1과 2가 서로 다른 임계 섹션 (즉, 다른 세마포어에 의해 처리되는) ​​인 경우, 1이 점유되면 누군가는 2를 입력 할 수 있습니다.

3

규칙은 간단합니다. 하나의 스레드 만이 특정 중요 섹션 (동일한 인스턴스에서 EnterCriticalSectionLeaveCriticalSection에 대한 호출 사이에서 실행되는 코드의 모든 부분) 내에서 코드를 실행할 수 있습니다. 코드의 일부와 같은 운영 체제의 관점에서 볼 때 함수는 여기에서 부적합합니다. 중요한 것은 언급 된 루틴에 대한 호출 횟수뿐입니다. 어떤 스레드가 을 특정 임계 영역 객체에 대해 LeaveCriticalSection 번 이상 호출 한 상황이 발생할 때마다 "임계 영역 내부"라고합니다.

사용자가 만든 여러 중요한 부분을 가질 수 있고 그들이 독립적으로 적용됩니다 말했다. 따라서 중요한 섹션 중 하나는 다른 중요한 섹션에 영향을 미치지 않습니다. 다른 중요한 섹션은 생성자에 대한 별도의 호출을 사용하여 만들어집니다.

2

이 참조 :

이 고려 변수

int k 
두 개의 스레드는 첫 번째 스레드가 읽기 시작 0에이 문

k+=100; 

지금 k는 동일 가정에 K에서 운영하는

k를 찾으면 k = 0을 찾은 다음 k를 100으로 더합니다. 그러면 두 번째 스레드가 첫 번째 스레드가 k = 100으로 쓰기 전에 k를 읽습니다. 그런 다음 두 번째 스레드는 k = 0으로 가정하고 100으로 추가하고 마지막으로 두 스레드가 k = 100이 아닌 200에 합류 한 후 k+=100을 중요한 섹션으로 설정합니다.

관련 문제