в режиме реального времени — тестирование переполнения стека

Есть ли способ определить, блокирует ли функция или поток? Я хочу создать контрольный пример, в котором я могу проверить, надежна ли функция в реальном времени.

0

Решение

Нет. Нет общего способа сделать это.

Есть много способов «блокировать», такие как спин-блокировка и аналогичные алгоритмы «попробуй-не-повторить», что нет реалистичного способа определить, какой код «блокирует».

Посмотрите на что-то вроде последовательной блокировки. Это блокировка, которая никогда не блокирует (единственную) запись, но заставляет читателей повторить попытку, если они произвели чтение во время записи (и, таким образом, могли прочитать искаженное значение).

Он очень хорошо масштабируется в читателях, особенно если записи относительно редки. Конечно, важным моментом является то, что читатели не блокируют друг друга, поэтому задержка при чтении является фиксированным значением в масштабе читателей.

Это спорный вопрос, является ли это технически безблокировочного и, конечно, невозможно написать инструмент для анализа алгоритма и определить, является ли блокировка свободной или в какой точке (логически) блокирование.

0

Другие решения

Нет, это невозможно. Рассмотрим эту функцию:

unsigned compute(unsigned x)
{
while (x < 10) {
if (x) {
x++;
}
}
return x;
}

Он будет работать в ограниченное время, если x равен нулю, и в этом случае это займет бесконечное время.

Вы не можете определить, существуют ли такие функции в вашей программе, из-за Проблема остановки.

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

Обратите внимание, что во многих системах дисковый ввод-вывод по сути является операцией блокировки, поэтому вам необходимо полностью отключить ее.

0

По вопросам рекламы [email protected]