IQTwist Resolver.
Алгоритм поиска решения является рекурсивным.
Я использовал синхронизацию на основе идентификатора потока в критической части рекурсивной функции (сбор найденных фигур в массив элементов). Важнейшие части, о которых я говорю:
Код: Выделить всё
bool IQTwistResolver::searchForSolution(const int type, const uint32 a_union)
{
if (m_stopSearch) //make all other threads unwind recursion and finish
return false;
if (TYPES_COUNT == type) //all types reached and solved - end recursion
{
m_mutex.lock();
if (std::thread::id::id() == m_firstFinder || std::this_thread::get_id() == m_firstFinder)
{
m_firstFinder = std::this_thread::get_id();
m_stopSearch = true;
}
m_mutex.unlock();
return true; //return true to collect the solution and unwind
}
...
Есть ли у этого подхода какие-либо возможные слабости/недостатки или излишки (возможно, я упускаю какое-то более простое решение)?
Вы бы использовали другой метод защиты этого «буфера решения»?
Возможно, вы бы использовали совершенно другую схему распараллеливания (стоит знать, что тоже)?
Подробнее здесь: https://stackoverflow.com/questions/581 ... e-and-neat
Мобильная версия