Не могу продумать алгоритм, чтобы потоки останавливались, пока происходит переключение vpn

Moved Other
  • Все привет!
    Разрабатываю софт для просмотра рекламы, который использует OpenVPN
    Реализовал функцию которая запускается из main с помощью "Вызов функции в несколько потоков", в функции прописано условие, при котором должно происходить переключение vpn, я хочу реализовать что-то по типу ожидания завершения потоков, чтобы каждый поток завершил текущий просмотр и не начинал новый пока vpn не переключиться на новую конфигурацию. Моя реализация следующая:
    bas1.png
    bas2.png
    Использовал тот же самый принцип с глобальными переменными, но для постоянного мониторинга выносил это в отдельную асинхронную функцию
    Я считаю, что это достаточно криво и буду рад, если кто-то сможет подсказать более оптимальное решение

  • Если делать по уму, то нужен массив в глобальной переменной или ресурсе, в котором каждый поток будет хранить своё состояние, а vpn-функция, на основании этого, будет решать, что ей делать.

  • @JImk4 said in Не могу продумать алгоритм, чтобы потоки останавливались, пока происходит переключение vpn:

    Я считаю, что это достаточно криво и буду рад, если кто-то сможет подсказать более оптимальное решение

    Нет в BAS встроенных mutex.

    Можешь оформить свое решение в виде модуля, будет выглядеть красиво, но под капотом будет все ровно тоже самое.

    Я для себя так и сделал. Пока я не освобожу mutex, другие потоки ждут очереди, пока не смогут его захватить.

    Так как у меня именованные mutex, то я могу городить их сколько угодно в своем коде с разными именами в разных местах.

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

    Capture.PNG
    Capture_1.PNG
    Capture_2.PNG

  • @sergerdn То есть ты хочешь сказать, что мой алгоритм не так плох, но для удобства лучше обернуть это все в отдельный модуль? Просто я думал, что это своеобразный костыль и можно сделать как-то по другому, но в голову ничего другого не приходит

  • @JImk4 said in Не могу продумать алгоритм, чтобы потоки останавливались, пока происходит переключение vpn:

    @sergerdn То есть ты хочешь сказать, что мой алгоритм не так плох

    Да.

    @JImk4 said in Не могу продумать алгоритм, чтобы потоки останавливались, пока происходит переключение vpn:

    но для удобства лучше обернуть это все в отдельный модуль?

    Да.

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

    Дополнительно нужда в блокировках не редкая вещь, поэтому можно таскать из проекта в проект однажды написанный модуль.

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

    В данном случае нужен тест точно ли происходит блокировка, то есть другие потоки ничего не делают, если какой-то поток не захватил mutex.
    Хотя бы по логам будет видно.

    Я пишу множество логов, так как если обернуть функционал в модуль, то потеряются номера кубиков и в будущем будет сложно понять где что пошло не так. Да и вообще логи сильно помогают в поиске ошибок.

    P.S.
    Это на словах звучит все красиво, в реальности же у меня целый комбайн который обрабатывает код модуля после автоматического билда его в BAS.

  • @sergerdn Понял, спасибо

  • @JImk4 тестировал как-то многопоток с синхронизацией через ресурс, отказался в пользу глобальной переменной, но вам может подойти:
    chkMultiTH.xml

  • я бы наверное попросил админа реализовать такую штуку - чтобы по окончании какого-то определенного количества потоков их можно было паузнуть все, потом заменить впн(или прокси, или что там еще можно) и после этого, только после проверки пинга что "интернет опять есть"(потому что у меня например на серваке при переключении впн интернет подходит только через минуту-две, я хз почему) дальше продолжал работу

    да, если будешь просить чтоб он это реализовал скажи чтоб еще тогда както это добавил в вариант если интернет пропал, чтоб они тоже останавливались и, возможно, алертовали что "мы перестали работать"

    кстати, а как ты переключение впн реализовал из баса, подскажи. тоже думал над этим но пока не делали

  • @basuser123 said in Не могу продумать алгоритм, чтобы потоки останавливались, пока происходит переключение vpn:

    я бы наверное попросил админа реализовать такую штуку

    Мсье оптимист :D

  • @Fox ну а я чо, я предлагаю функционал который бы хотел видеть, а внедрять его или нет - уже решать разработчикам

  • ModeratorM Moderator moved this topic from Off topic on