2012-01-14 2 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. Значение INT_MAX в вызове FUTEX_WAKE указывает, что он должен пробудить все потоки, ожидающие этого futex. Оператор if в функции changeValue представляет собой оптимизацию, которая позволяет избежать бессмысленных пробуждений. Наконец, вызов FUTEX_WAIT должен храниться в цикле, потому что он может возвращаться ложно от сигналов.

Следует также отметить, что вы не дали подробностей о проблеме, которую пытаетесь решить, что означает, что этот фрагмент кода, вероятно, подходит только для самых простых случаев использования. Если вы хотите что-то лучше приспособлены для решения текущей проблемы, то мне нужно больше информации (количество потоков, контекст, в котором waitUntilNotEqual и changeValue называются, количество возможных одновременных потоков в waitUntilNotEqual или changeValue и т.д.)

Если вы заинтересованные в получении дополнительной информации о том, как правильно использовать futexes, я рекомендую документ Futexes Are Tricky.