이 방법 (필자는 기능이 몇 가지 추가 매개 변수를해야 할 수도 실현) :futex를 사용하여이 방법을 구현하려면 어떻게해야합니까?
void waitUntilNotEqual(volatile int* addr, int value)
{
while (*addr == value) {}
}
이 방법 (필자는 기능이 몇 가지 추가 매개 변수를해야 할 수도 실현) :futex를 사용하여이 방법을 구현하려면 어떻게해야합니까?
void waitUntilNotEqual(volatile int* addr, int value)
{
while (*addr == value) {}
}
이 매뉴얼 페이지를 참조하십시오 : http://ds9a.nl/futex-manpages/futex2.html을하고 당신은 여전히 그 후해야 할 일이 있다면 알려 주시기 바랍니다. 귀하의 질문에서 확실하지 않은 한 가지는 값이 업데이트되었다는 것을 알려주는 다른 함수를 사용할지 아니면 시간 초과를 사용하는 것을 선호하는지 여부입니다.
나는 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
등의 waitUntilNotEqual
및 changeValue
가 호출 컨텍스트되는 스레드, 가능한 동시 스레드의 수 수) 자세한 내용이 필요 futex를 제대로 사용하는 방법에 대해 더 알고 싶다면 Futexes Are Tricky 종이를 사용하는 것이 좋습니다.