두 개의 스레드가있는 프로그램을 상상해보십시오. 스레드 B는 끊임없이 '시험'에을 0xdeadbeef 기록되지 않습니다 그런 실패 스레드 A의 CAS를 야기하는경쟁하는 원자 적 연산이 서로 굶주 리지 않을 수 있습니까?
// Visible to both threads
static int test;
// Run by thread A
void foo()
{
// Check if value is 'test' and swap in 0xdeadbeef
while(!CAS(&test, test, 0xdeadbeef)) {}
}
// Run by thread B
void bar()
{
while(1) {
// Perpetually atomically write rand() into the test variable
atomic_write(&test, rand());
}
}
가 가능 : 그들은 다음 코드 (CAS는 Compare and Swap을 말한다)을 실행? 또는 자연스러운 스케줄링 지터는 실제로 이런 일이 발생하지 않는다는 것을 의미합니까? 일부 작업이 스레드 A의 while 루프에서 수행되면 어떻게됩니까?
두 번만 실행되는 이유는 무엇입니까? 테스트의 가져 오기를 최적화하면 영원히 * 루프 할 수있는 효과가 있습니까? 운이 좋다면 rand()가 테스트가 스레드 A가 루프에 들어가기 전에 발생한 값을 반환하고 스레드 A가 적시에 실행되는 경우를 제외하고는 비교가 영구적으로 잘못 될 것이기 때문에 비교와 스왑은 항상 실패합니다. –
또한 믿을 수 없을 정도로 어렵다고 할 때, 프로덕션 소프트웨어에서이 코드를 사용하는 것에 반대하지 않는다는 것을 의미합니까? 단순화 된 확률을 계산하는 것이 흥미로울 것입니다. –
스레딩 문제를 언급 할 때 개인적으로 믿어지지 않을 정도로있을 법하지 않다고 말하면, 실제로는 일어나지 않도록 고정시키고 싶습니다. 나는 너무 많은 "일어나지 않을거야"나에게 날려 버렸어. –