Помогите с логикой: выполнение функции любым, но только одним потоком



  • Всем привет!

    Ломаю голову над одной задачкой. Как оптимальнее всего продумать логику, чтобы при многопотоке каждая функция выполнялась любым потоком, но только одним?

    Допустим, есть у нас в Main вызов 123 функций и скрипт работает в 17 потоков (цифры сугубо для примера). Как сделать так, чтобы в каждую функцию мог зайти только один поток, но без привязки к его индексу?

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

    Был бы признателен за любые советы!



  • Возможно так?
    если номер потока = 1, то запустить функцию 123
    если номер потока = 2, то запустить функцию 456
    и т.д.



  • @UA делаем глобальную переменную с значением 0, потом условие если эта переменная == 0 - вызов функции, на страте функции сразу увеличиваем переменную. Желательно что бы при этом потоки запускались с паузой между друг другом.
    ПС. на каждую функцию своя переменная



  • @gaget007, так я хотел делать изначально, но это совсем не универсально. Поэтому и решил искать вариант без привязки к индексам (номерам потоков).

    @DrPrime, вот о чём-то таком как раз и думал, но здесь отталкивает необходимость плодить кучу переменных и есть риск, что всё равно в функцию зайдёт больше потоков, чем один.

    Эх, видимо, простого решения здесь не придумать :)

    В любом случае, спасибо за ответы!



  • @UA Прямо в вопросе есть уже ответ.

    чтобы в каждую функцию мог зайти только один поток

    Как и сказал @DrPrime через глобальную переменную.
    Можно ещё как вариант, выделить сервисный поток, который и будет определять, какому потоку какую функцию запускать, через цикл и глобальные переменные.



  • @Fox, можно чут-чуть подробнее про сервисный поток?



  • @DrPrime, проверяю этот вариант в тестовом проекте. К моему удивлению, не налазят потоки один на другой. И это при одновременном старте всех потоков сразу, без пауз.

    Остановлюсь пока на нём, хоть и придётся наплодить сотню-другую глобалок :\



  • @UA У меня в скрипте реализовано так. If [[THREAD_INDEX]] == 1 , а в нём уже функции которые через глобальные переменные управляют всем скриптом. Например первый поток читает reboot.txt (или get-запрос в админку), если в нём не 0, то установить глобальную переменную GLOBAL_REBOOT значением взятым из файла. А остальные потоки периодически проверяют значение GLOBAL_REBOOT, и если [[GLOBAL_REBOOT]] == [[THREAD_INDEX]], то завершить поток.
    И всё в том же духе, у меня всё управление скриптом завязано на первом потоке.



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



  • @paini, уж проще глобальными флажками разруливать. Единственный минус - это морока с созданием массы переменных. Довольно громоздко выходит. Но зато работает и это главное :)



  • можно и так



  • @UA О какой массы переменных идёт речь? Ведь переменная всего одна, глобальная и всё.



  • @Fox функций много, и для каждой нужен контроль


Log in to reply
 

  • 11
  • 5
  • 14
  • 1
  • 4
  • 5
  • 2
  • 6