Возникла вот такая проблема. Надо мне одновременно работать с несколькими СОМ портами. Логика обработки данных для портов совершенно одинаковая. Создаю для каждого порта поток. Т.к. логика одинаковая, то например для записи в порт, использую для всех портов свою ф-ию SendMyData(). А вот как теперь обезопасить данные, если 2 потока будут одновременно вызывать эту ф-ию? Если взять ее в крит. секцию, то все будет работать медленно, так как ф-ии записи и чтения из порта довольно медленные и будут тормозить остальные потоки. Посоветуйте плиз, как это лучше реализовать.
Ну если эта функция не использует никаких глобальных переменных, то
никаких критических секций не надо, поскольку все локольные переменные
и параметры располагаются на стеке.
Здравствуйте Willi, вы писали:
W>Здравствуйте Serge
W>Ну если эта функция не использует никаких глобальных переменных, то W>никаких критических секций не надо, поскольку все локольные переменные W>и параметры располагаются на стеке.
Т.е. я так понимаю, что если 2 потока одновременно выполняют одну и ту же функцию, то в каждый момент времени эта функция работает с данными 1 потока, а при переключении на другой поток получает данные другого потока?
Здравствуйте Serge, вы писали:
S>Т.е. я так понимаю, что если 2 потока одновременно выполняют одну и ту же функцию, то в каждый момент времени эта функция работает с данными 1 потока, а при переключении на другой поток получает данные другого потока?
Что значит "с даннымим одного потока" ?
У всех потоков одного процесса память общая а значит и данные общие.
Разделение данных по потоком это всегда условность.
Ты сам должен решить куда и какой поток будет лазить.
И если два потока лезут в одно место, значит нужно ставить критические
секции.
Однако, стек у каждого потока свой, т.е. локольные переменные
и параметры при вызове функции из разных потоков, располагаются в разных местах
и следовательно защищать ничего не надо.
в приведенном выше примере нет ниодной глобальной переменной
и если не передавать из потока в поток указатели на данные
никакой защиты не нужно
однако, если мы захотим вынести LIST_ITEM* pHead в область глобальных
переменных и разрешим доступаться к списку из всех потоков
во тут-то и придется задуматься о снхронизации