Является ли такая синхронизация на основе идентификатора потока безопасной и аккуратной? - PullRequest
0 голосов
/ 28 сентября 2019

Я написал небольшую программу, которая разрешает головоломки IQ Twist (https://www.smartgames.eu/uk/one-player-games/iq-twist).

Затем, в качестве упражнения, я распараллелил ее. Вот источник: https://bitbucket.org/bloGit/iqtwist/src/master/IQTwist_engine/IQTwistResolver.cpp

Алгоритм, который ищетрешение рекурсивно.

Я использовал синхронизацию на основе идентификатора потока в критической части рекурсивной функции (сбор найденных фигур в массив элементов). Важнейшие части, на которые я ссылаюсь: ... 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 ...

и: ... if (std::this_thread::get_id() == m_firstFinder) { m_solutionSet[type] = variant; } return true; ...

Я пытаюсь обратиться за советом к экспертам:

Есть ли у этого подхода какие-либо возможные недостатки / недостатки или излишества (возможно, мне не хватает некоторыхболее простое решение)?

Не могли бы вы использовать другой метод защиты "буфера решений"?

Возможно, вы бы использовали совершенно иную схему распараллеливания (это тоже стоит знать)?

Любые другие замечания относительно кода приветствуются:)

...