Хотя я не могу помочь (пока!) В большинстве ваших проблем, я думаю, что наш инструмент C ++ Test Coverage может предоставить вам данные многопоточного покрытия тестов довольно легко.
Этот инструмент использует ваш исходный код; Вы компилируете и запускаете это. Вы в конечном итоге (дешево)
инструментальные зонды в вашем коде, представляющие различные блоки. Приборы
записывает, какие части вашей программы выполняются, номинально как битовый вектор с одним
бит на измерительный зонд. В конце выполнения (или когда вам угодно) это
Битовый вектор сбрасывается, и зритель покажет его вам наложенным на код.
Хитрость в получении покрытия для многопоточных тестов заключается в том, что мы предоставляем вам
контроль над определением того, как работают датчики; они макросы. Так что вместо
используя макрос по умолчанию, по существу,
probe[n]=true;
в логическом массиве, вы можете вместо этого реализовать
probe[n]|=1<<threadid;
в массиве int (или что-то умное дешевле, предварительно вычислив это значение).
Вероятно, для реализации потребуется всего несколько строк кода.
Люди могут заметить, что это технически проблемы с синхронизацией.
Это правда, но в лучшем случае немного теряет
данных покрытия, и шансы против этого довольно высоки. Большинство людей
довольны "довольно хорошими" данными, а не идеальными. Если вы настаиваете
на совершенстве, вы заплатите высокую цену синхронизации, используя некоторые
инструкция атомарного обновления.
Мы также предоставляем вам контроль над логикой сброса зонда; Вы можете пересмотреть его, чтобы выписать
данные покрытия потока (в десятках строк пользовательского диапазона кода).
Средство просмотра данных о тестовом покрытии позволит вам увидеть специфичное для потока покрытие
(просто выберите правильный вектор покрытия); он также имеет встроенное средство для
легко вычислять / отображать пересечение / объединение / разность
на векторах покрытия, что дает вам точное отношение покрытия на поток.