Как протестировать и протестировать реализации мьютекса

12

Как видно из заголовка: как правильно тестировать и тестировать различные реализации мьютексов в c ++?

По сути, я написал свой собственный класс, похожий на std :: mutex, для проекта, работающего на 2 ядрах, armv7, с целью минимизировать накладные расходы в неоспоримом случае. Сейчас я рассматриваю возможность использования указанного мьютекса в других местах, а также в других архитектурах, но прежде чем я сделаю это, я хотел бы убедиться, что

  • это действительно правильно
  • нет никаких патологических случаев, в которых он работает намного хуже, чем стандартный std :: mutex.

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

  • Итак, существуют ли какие-либо методы статического или динамического анализа?
  • Каковы распространенные подводные камни при написании модульных тестов для классов мьютекса?
  • На какие типичные крайние случаи следует обращать внимание (с точки зрения производительности)?

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

MikeMB
источник
2
Я знаю, что это не обязательно, но я был бы признателен, если бы downvoters прокомментировали, в чем проблема с этим вопросом. Я новичок в SE и не совсем знаком со спецификой этого сайта.
MikeMB
3
Не голосующий против, но я скажу, что этот сайт особенно плох для анонимных голосов по совершенно хорошим вопросам. Мне кажется, что многие люди отказываются от голосования, основываясь на том, что я бы назвал «религиозными» причинами. Тем не менее, одна возможность состоит в том, что вы запрашиваете рекомендации по инструментам, которые, я думаю, здесь не одобряются . Но это только предположение. И многие люди обсуждали такие инструменты в других вопросах, так что делайте из этого то, что вы будете.
user1118321
4
На самом деле, ознакомьтесь с этой мета-публикацией под названием «Голосование вниз, потому что мы не согласны с подходом или логикой Аскера».
user1118321
@ user1118321: этот мета-пост не подходит к этому вопросу, так как ИМХО в этом вопросе нет ошибочного предположения. Однако два из 3 закрытых голосов, которые я вижу в настоящее время, используют предопределенную причину закрытия запроса сторонней организации. MikeMB, вы можете попытаться отредактировать свой вопрос и удалить эти части из него, однако, в текущей форме, я думаю, сообщество также может закрыть его за то, что оно слишком широкое. Если вы сузите фокус вопроса и конкретно спросите, что вы хотите проверить и что вы пробовали до сих пор, вы можете увеличить вероятность выживания вашего вопроса.
Док Браун
Одна проблема с этим вопросом заключается в том, что «Вопросы, в которых нас просят найти или порекомендовать инструменты, библиотеки, языки программирования, ресурсы (включая книги, блоги, учебные пособия и примеры) или проекты, которые необходимо выполнить, не являются здесь темой, поскольку они привлекают к себе объективные ответы, которые не будет иметь долгосрочной ценности для других ".
Дэвид

Ответы:

1

Вопрос сложный:

Некоторые источники сложности включают в себя:

  • Сколько переключений контекста происходит: это очень важно в зависимости от платформы, на которой выполняются эти тесты. Некоторые платформы справляются с этим лучше, чем другие
  • Являются ли функции, которые проверяются мьютексами, встроенными или нет. т.е. работает ли мьютекс только в хорошо оптимизированном или оптимизируемом коде.
  • Эти мьютексы предназначены для локальности кэша. Будут ли ошибки в кэше значительно снижать производительность или вызывать больше переключений контекста. до и после ввода мьютекса.
  • Будет ли сам мьютекс вызывать потерю локальности кэша. т.е. данные состояния мьютекса распределяются динамически.
  • Будут ли эти мьютексы работать хорошо там, где внутри мьютекса содержатся переключатели контекста. то есть io, malloc и т. д.
  • Будет ли мьютекс работать хорошо, если время ядра содержится в динамическом выделении и освобождении памяти mutex.ie.
  • Сохраняется ли производительность при работе в виртуальных машинах?
  • Является ли уничтожение или создание мьютекса дорогостоящим, т.е. данные о состоянии находятся в динамической памяти
Кристиан Преторий
источник
1
Не уверен, если я согласен с частью строительства / разрушения. Если программа все время создает и уничтожает ваши мьютексы, то (imho) что-то не так с дизайном проекта. Но в остальном спасибо за указатели.
MikeMB
-1

Ваша идея очень интересна: эталон соответствия, с которым может быть проверена реализация мьютекса.

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

И, так как вы участвовали в создании эталонной реализации, вы парень.

Если вы позволите мне сделать предложение, возможно, вы могли бы начать это исследование со стандарта POSIX для потоков в одну сторону и с некоторого изучения теоретической литературы по параллельной обработке, такой как CSP, или «Передача последовательных процессов». Этот тип бумаг обычно имеет дело с классическими параллельными проблемами, такими как Обедающие Философы.

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

Хилтон Фернандес
источник
3
Я не отрицал вас, но это, кажется, не отвечает ни на один из моих вопросов.
MikeMB
Спасибо, что не понизили голосование. И извините, что не отвечаю на ваши вопросы. Вы не возражаете, если я спрошу, не планируете ли вы создать эталон соответствия для мьютексов?
Хилтон Фернандес
Вряд ли. И даже если я забочусь только о стандарте C ++ (хотя он может быть таким же, как posix в отношении мьютексов)
MikeMB
Чтобы уточнить мое предыдущее утверждение: если мне придётся создать хороший набор тестов для моего собственного мьютекса, я, скорее всего, сделаю его открытым исходным кодом, но я очень сомневаюсь, что он будет качественным или будет достаточно полным, чтобы стать реальным эталон "соответствия" - это может быть то, что в любом случае лучше обрабатывать статическим анализом.
MikeMB
Я согласен с вами, что не существует хорошего набора тестов для мьютексных примитивов. Я предполагаю, что это должно происходить из трех различных источников: теория параллельной обработки, спецификация мьютекса POSIX и параллельные алгоритмы, выраженные с использованием мьютексов. Согласны ли вы с этим ?
Хилтон Фернандес