문제

이 기능의 이름은 이것이 복잡한 일이 진행되는 것처럼 보입니다. 정확히 다음과 같은 일을하는 대신 이것이 갈 길이라는 것을 정확히 알 수 있습니다.

준비Critical_section CS; int *p = malloc (sizeof (int)); // 할당 사이트 initializeCriticalSection (& cs); // 첫 번째 쓰기에 대한 힌트

스레드 #1{ *p = 1; // 첫 번째 쓰기}

스레드 #2{enterCriticalSection (& cs); *p = 2; // 두 번째 쓰기 LeaveCriticalSection (& cs); }

한 스레드에서 수행되는 글이 있습니다.

Run()
{
// some code
m_bIsTerminated = TRUE;
// some more code
}

그런 다음 다른 스레드 (잠재적으로 동시에)에서 수행되는 읽기가 있습니다.

Terminate()
{
// some code
if( m_bIsTerminated )
{
m_dwThreadId = 0;
m_hThread = NULL;
m_evExit.SetEvent();
return;
}
// even more code
}

이 레이스 조건을 해결하기위한 최상의 솔루션은 무엇입니까? 중요한 섹션은 갈 길이 아니면 InterlockedExchangeadd ()를 사용하는 것이 더 유용합니까?

도움이 되었습니까?

해결책

InterlockedExchangeadd는 원자 연산으로 정수에 값을 추가하는 데 사용됩니다. 즉, 중요한 섹션을 사용할 필요가 없습니다. 또한 스레드 중 하나가 예외를 던지면 교착 상태의 위험이 제거됩니다. 다른 스레드가 해당 잠금 장치를 얻지 못하도록 어떤 종류의 잠금 장치도 유지하지 않아야합니다.

시나리오의 경우 연동 조정 ...- 함수를 확실히 사용할 수 있지만 이벤트 (Createevent, Setevent, WaitforsingleObject)를 사용할 수 있습니다. 시나리오에서).

UPD : 변수에 휘발성을 사용하는 것이 작동하지만 권장되지는 않습니다. 참조하십시오. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2016.html 그리고 http://www-949.ibm.com/software/rational/cafe/blogs/ccpp-parallel-multicore/tags/c%2B%2B0X 예를 들어.

휴대하기를 원한다면 살펴보십시오. 부스트 :: 스레드.

다른 팁

귀하의 경우에는 인종 조건이 없습니다. 변수는 다시 거짓으로 재설정되지 않습니다. 스레드를위한 "제발 죽어"스위치 일뿐입니다. 그런 다음 어떤 종류의 동기화가 필요하지 않습니다.

InterlockedXXX 기능 제품군은 Intel CPU의 원자 3 오퍼 랜드 명령 (XADD 및 CMPXCNG)을 사용합니다. 따라서 중요한 섹션보다 훨씬 저렴합니다. 스레드-안전 할당에 원하는 것은 interlockedCompareexChange ()입니다.

UPD : 변수를 휘발성으로 표시합니다.

m_bisterminated가 휘발성으로 표시되어 있는지 확인하면 괜찮을 것입니다. 당신이 "정리 된 후"더 많은 코드가 true에 대해 더 이상한 것 같지만 // 그 변수는 정확히 무엇을 나타내나요?

"레이스 조건"은 다양한 // 더 많은 코드 요소가 다른 순서로 실행될 수 있다는 것입니다. 귀하의 변수는 도움이되지 않습니다. 그들이 결정적인 순서로 실행하도록하는 당신의 목표입니까? 그렇다면 한 스레드에서 대기하고 다른 스레드로 설정하려면 조건 변수가 필요합니다. 동시에 실행하는 것을 원하지 않는다면 중요한 섹션은 괜찮을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top