То, что лучший способ состоит в том, чтобы протестировать реализацию взаимного исключения, действительно корректно? (Необходимо реализовать взаимное исключение, повторное использование не является жизнеспособным вариантом),
Лучшее, которое я придумал, должно иметь много (N) параллельных потоков, многократно пытаясь получить доступ к защищенному региону (I) времена, который имеет побочный эффект (например, обновление глобального) так, чтобы количество доступов + записи могли считаться, чтобы гарантировать, что количество обновлений глобального точно (N) * (I).
Какие-либо другие предложения?
Это напоминает мне вопрос о тесте семафоров FIFO . Вкратце мой ответ был:
Так что ваше предложение кажется разумно лучшим. Если вы хотите повысить свою уверенность, используйте фаззинг для рандомизации планирования и ввода.
Формальное доказательство лучше, чем тестирование такого рода вещей.
Тестирование покажет вам, что - если вам не повезло - все это сработало. Но испытание - инструмент тупой; он может не выполнить точную правильную последовательность, что приведет к сбою.
Слишком сложно протестировать каждую возможную последовательность операций, доступных на оборудовании, чтобы убедиться, что ваш мьютекс работает при любых обстоятельствах.
Испытания не лишены ценности; это показывает, что вы не допустили никаких очевидных ошибок кодирования.
Но вам действительно нужна более формальная проверка кода, чтобы продемонстрировать, что он делает правильные вещи в нужное время, чтобы один клиент атомарно захватил ресурс блокировки, необходимый для правильного мьютекса. На многих платформах есть специальные инструкции для реализации этого, и если вы используете одну из них, у вас есть шанс сделать это правильно.
Точно так же вы должны показать, что релиз является атомарным.
Я со всеми остальными, что это невероятно сложно доказать окончательно, я понятия не имею, как это сделать - я знаю, бесполезно!
Когда вы говорите о внедрении мьютекса, а повторное использование недопустимо, это связано с техническими причинами, например, отсутствием реализации Mutex на платформе / ОС, которую вы используете, или по какой-либо другой причине? Является ли упаковка некоторой формы «блокировки» уровня ОС и называть ее своей реализацией Mutex вариантом, например, CriticalSection на windoze, переменные условия posix? Если вы можете обернуть блокировку ОС более низкого уровня, то ваши шансы сделать это намного выше.
Если вы еще этого не сделали, прочтите статьи Herb Sutter's Effective Concurrency . В них должно быть что-то стоящее для вас.
В любом случае, некоторые моменты, которые следует учитывать в ваших тестах:
Удачи!
Используя нечто вроде мьютекса, мы возвращаемся к старому правилу, согласно которому тестирование может демонстрировать только наличие ошибок, а не их отсутствие. Год тестирования, вероятно, скажет вам меньше, чем просто выставить код на проверку и спросить, не видит ли кто-нибудь в нем проблемы.
Если доказательства этого не подтверждают? не работает для вас, тогда переходите к тестированию. Обязательно протестируйте все возможные варианты использования. Узнайте, как именно эта вещь будет использоваться, кто будет ее использовать и, опять же, как она будет использоваться. Когда вы идете по маршруту тестирования, обязательно запускайте каждый тест для каждого сценария множество раз (миллионы, миллиарды, столько, сколько вы можете получить за время тестирования, которое у вас есть).
Старайтесь быть случайным, потому что случайность даст вам лучший шанс охватить все сценарии в ограниченном количестве тестов. Обязательно используйте данные, которые будут использоваться, и данные, которые могут не использоваться, но могут быть использованы, и убедитесь, что данные не нарушают блокировки.
Кстати, если вы не разбираетесь в математике и формальных методах, у вас не будет никаких шансов найти доказательство.