Этот метод (я понимаю, что функция может потребоваться некоторые дополнительные параметры):Как реализовать этот метод с помощью 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
. Значение INT_MAX
в вызове FUTEX_WAKE
указывает, что он должен пробудить все потоки, ожидающие этого futex. Оператор if в функции changeValue
представляет собой оптимизацию, которая позволяет избежать бессмысленных пробуждений. Наконец, вызов FUTEX_WAIT
должен храниться в цикле, потому что он может возвращаться ложно от сигналов.
Следует также отметить, что вы не дали подробностей о проблеме, которую пытаетесь решить, что означает, что этот фрагмент кода, вероятно, подходит только для самых простых случаев использования. Если вы хотите что-то лучше приспособлены для решения текущей проблемы, то мне нужно больше информации (количество потоков, контекст, в котором waitUntilNotEqual
и changeValue
называются, количество возможных одновременных потоков в waitUntilNotEqual
или changeValue
и т.д.)
Если вы заинтересованные в получении дополнительной информации о том, как правильно использовать futexes, я рекомендую документ Futexes Are Tricky.