전역 변수를 사용하여 스레드 간 통신을 구현하고 있습니다. 위의 코드에서은 대입 연산자 '='원자입니까?
//global var
volatile bool is_true = true;
//thread 1
void thread_1()
{
while(1){
int rint = rand() % 10;
if(is_true) {
cout << "thread_1: "<< rint <<endl; //thread_1 prints some stuff
if(rint == 3)
is_true = false; //here, tells thread_2 to start printing stuff
}
}
}
//thread 2
void thread_2()
{
while(1){
int rint = rand() % 10;
if(! is_true) { //if is_true == false
cout << "thread_1: "<< rint <<endl; //thread_2 prints some stuff
if(rint == 7) //7
is_true = true; //here, tells thread_1 to start printing stuff
}
}
}
int main()
{
HANDLE t1 = CreateThread(0,0, thread_1, 0,0,0);
HANDLE t2 = CreateThread(0,0, thread_2, 0,0,0);
Sleep(9999999);
return 0;
}
질문, 나는 thread_1과 thread_2 사이에 인쇄 전환 할 글로벌 VAR volatile bool is_true
를 사용합니다.
여기은 할당 작업을 스레드로부터 안전하게 사용할 수 있는지 궁금합니다. ?
원자 교환 프리미티브를 사용하는 것을 선호하지만 문제가 발생하는 시나리오는 해결할 수 없습니다. –
@KerrekSB,이 시나리오는 무엇입니까? 글쎄, 난 그냥 내 질문을 설명하기 위해 즉흥적으로 :) – Alcott
글쎄, 나는 두 스레드가 중요한 섹션을 입력 할 수 있도록 충분히 부러 것이로드 및 저장소의 순서를 의미 ... 일반적으로 하나의 순서를 입증 할 수 있어야합니다 특정 코드가 올바르지 않은 이유를 보여줍니다. 그래도 나는 그것을 볼 수 없다. 나는 여전히 코드가 마음에 들지 않지만 왜 그런지 증명할 수는 없다. –