Как лучше всего протестировать реализацию Mutex?

Каков наилучший способ протестировать реализацию мьютекса, действительно верно? (Необходимо реализовать мьютекс, повторное использование не является жизнеспособным вариантом)

Лучшее, что я придумал, состоит в том, чтобы иметь много (N) параллельных потоков, итеративно пытающихся получить доступ к защищенному региону (I) раз, что имеет побочный эффект (например, обновление для глобального), так что количество обращений + записи могут быть подсчитаны, чтобы гарантировать, что количество обновлений для глобального равнозначно (N) * (I).

Любые другие предложения?

Ответ 1

Это напоминает мне этот вопрос о тесте семафора FIFO. В двух словах я ответил:

  • Даже если у вас есть спецификация, возможно, она не передает ваше намерение точно
  • Вы можете доказать, что алгоритм выполняет спецификацию, но не код (D. Knuth)
  • Тест показывает только наличие ошибки, а не их отсутствие (Дейкстра)

Итак, ваше предложение кажется разумным лучшим. Если вы хотите повысить свою уверенность, используйте fuzzing для рандомизации планирования и ввода.

Ответ 2

Формальное доказательство лучше, чем тестирование для такого рода вещей.

Тестирование покажет вам, что - пока вам не повезло - все это сработало. Но тест - тупой инструмент; он может не выполнить точную правильную последовательность, чтобы вызвать сбой.

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

Тестирование не без ценности; это показывает, что вы не делали никаких очевидных ошибок в кодировании.

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

Аналогично, вы должны показать, что релиз является атомарным.

Ответ 3

Что-то вроде мьютекса, мы вернемся к старому правилу, что тестирование может только продемонстрировать наличие ошибок, а не отсутствие. Год тестирования, вероятно, скажет вам меньше, чем просто поставить код для проверки и спросить, есть ли у кого-нибудь проблемы с ним.

Ответ 4

Я со всеми остальными, что это невероятно сложно доказать окончательно, я понятия не имею, как это сделать - не полезно знать!

Когда вы говорите, что реализуете мьютекс и что повторное использование не является вариантом, это по техническим причинам, например, при использовании Mutex на используемой платформе/ОС или какой-либо другой причине? Является ли перенос какой-либо формы блокировки уровня ОС и называет ее реализацию Mutex опцией, например CriticalSection на windoze, posix Condition Variables? Если вы можете обернуть блокировку OS более низкого уровня, то ваши шансы получить ее право намного выше.

Если вы еще этого не сделали, зайдите и прочитайте "Эффекты травы" Concurrency. Там должно быть что-то в этом стоит того.

В любом случае, некоторые вещи, которые следует учитывать в ваших тестах:

  • Если ваш мьютекс рекурсивный (т.е. тот же поток может блокировать его несколько раза), то убедитесь, что вы контрольные счетные тесты.
  • С вашей глобальной переменной, которую вы изменить было бы лучше, если бы это было которая не может быть записана в атомарно. Например, если вы на 8-битной платформе, затем используйте 16 или 32-битная переменная, которая требует несколько инструкций по сборке для записи.
  • Внимательно изучите листинг сборки. В зависимости от аппаратной платформы, хотя сборка не переводит непосредственно на то, как можно оптимизировать код...
  • Получить кого-то, кто не написал код, также написать несколько тестов.
  • тестируйте как можно больше различных машин с различными спецификациями (при условии, что это "общая цель", а не для конкретной аппаратной настройки).

Удачи!

Ответ 5

Если доказательство не сработает для вас, перейдите к тестированию. Обязательно проверьте все возможные варианты использования. Узнайте, как именно эта вещь будет использоваться, кто ее будет использовать и, опять же, как она будет использоваться. Когда вы отправляетесь на тестовый маршрут, обязательно выполняйте каждый тест для каждого сценария в несколько раз (миллионы, миллиарды, столько, сколько вы можете получить с временем тестирования, которое у вас есть).

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

Кстати, если вы не знаете тонну о математике и формальных методах, у вас не будет никаких шансов на то, чтобы на самом деле придумать доказательство.