Размышлял как-то над юнит тестированием многопоточного кода - возможно ли оно, и как бы это так выкрутить.
Предположения:
1. Нам нужно про-юнит-тестить два треда, выполняющие разный или одинаковый код.
2. Специфические для мультитредовых программ ошибки возникают из-за race conditions (и синхронизации их результатов в разных видах).
Достаточно глупая идея:
1. Расставить в коде всех тредов вручную (вызовами специальных функций) или автоматически (анализом байт-кода) "контрольные точки", в которых возникают race conditions на чтение или запись. Пусть это будут в первом треде p1, p2, ... pn, и во втором - q1, q2, ...., qm.
2. Тупо прогнать тестируемые треды так, чтобы точки синхронизировались во всех возможных сочетаниях: а) (p1 с q1 и p2 с q2, ...) б) (p1 с q2 и p2 с q3, ...), ... в) (p1 с q1, p2 c никакой) и т.д. Ва) (p1 с q1 и p2 с q2, ...)
Всего будет конечное количество таких множеств пар, кажется, M!*N!. Много. Можно проредить, оставить только те множества пар, которые пересекаются по одной и той же переменной. Это уменьшит сложность задачи на порядки - теперь это будет сумма величин (Mi!)*(Ni!), где Mi и Ni - количество точек race conditions по i-й переменной. Это гораздо меньше, и автоматически это можно перебрать.
Покритикуйте идею, пожалуйста :)
P.S. Блин, как набрать формулу в HTML? :)
Предположения:
1. Нам нужно про-юнит-тестить два треда, выполняющие разный или одинаковый код.
2. Специфические для мультитредовых программ ошибки возникают из-за race conditions (и синхронизации их результатов в разных видах).
Достаточно глупая идея:
1. Расставить в коде всех тредов вручную (вызовами специальных функций) или автоматически (анализом байт-кода) "контрольные точки", в которых возникают race conditions на чтение или запись. Пусть это будут в первом треде p1, p2, ... pn, и во втором - q1, q2, ...., qm.
2. Тупо прогнать тестируемые треды так, чтобы точки синхронизировались во всех возможных сочетаниях: а) (p1 с q1 и p2 с q2, ...) б) (p1 с q2 и p2 с q3, ...), ... в) (p1 с q1, p2 c никакой) и т.д. Ва) (p1 с q1 и p2 с q2, ...)
Всего будет конечное количество таких множеств пар, кажется, M!*N!. Много. Можно проредить, оставить только те множества пар, которые пересекаются по одной и той же переменной. Это уменьшит сложность задачи на порядки - теперь это будет сумма величин (Mi!)*(Ni!), где Mi и Ni - количество точек race conditions по i-й переменной. Это гораздо меньше, и автоматически это можно перебрать.
Покритикуйте идею, пожалуйста :)
P.S. Блин, как набрать формулу в HTML? :)
Tags: