2012-01-14 3 views

답변

0

이 매뉴얼 페이지를 참조하십시오 : http://ds9a.nl/futex-manpages/futex2.html을하고 당신은 여전히 ​​그 후해야 할 일이 있다면 알려 주시기 바랍니다. 귀하의 질문에서 확실하지 않은 한 가지는 값이 업데이트되었다는 것을 알려주는 다른 함수를 사용할지 아니면 시간 초과를 사용하는 것을 선호하는지 여부입니다.

0

나는 futexes를 사용하는 것에 대해 아주 새로운데, 여기서는 해결책이 있어야한다고 생각합니다. 내가 이것을 전혀 테스트하지 않았 음을 알리면 몇 가지 수정 작업을 더 빨리 수행 할 수 있습니다. 제대로 작동하려면이 위해서는

void waitUntilNotEqual(volatile int* addr, int value) { 
    while (*addr == value) { 
    futex(addr, FUTEX_WAIT, value, 0, 0, 0); 
    } 
} 

void changeValue (volatile int* addr, int newValue) { 
    int oldValue = *addr; 
    if (oldValue != newValue) { 
    *addr = newValue; 
    futex(addr, FUTEX_WAKE, INT_MAX, 0, 0, 0); 
    } 
} 

waitUntilNotEqual에 전달 된 주소의 모든 변경은 changeValue를 통해 수행해야합니다. FUTEX_WAKE 호출의 INT_MAX 값은이 futex에서 대기중인 모든 스레드를 다시 시작해야 함을 나타냅니다. changeValue 함수의 if 문은 무의미한 웨이크 업을 피하는 최적화입니다. 마지막으로 FUTEX_WAIT 호출은 신호에서 가짜로 반환 될 수 있으므로 루프를 유지해야합니다.

해결해야 할 문제에 대해 자세히 설명하지 않았다는 것을 지적해야합니다. 즉,이 코드는 사용 사례 중 가장 간단한 경우에만 맞을 것임을 의미합니다. 당신이 뭔가 더 나은 현재의 문제에 적용 할 경우, 나는

당신이 경우 (waitUntilNotEqual 또는 changeValue 등의 waitUntilNotEqualchangeValue가 호출 컨텍스트되는 스레드, 가능한 동시 스레드의 수 수) 자세한 내용이 필요 futex를 제대로 사용하는 방법에 대해 더 알고 싶다면 Futexes Are Tricky 종이를 사용하는 것이 좋습니다.