Как их сделать безопасными?
От: Serge Чехия  
Дата: 30.05.01 11:01
Оценка:
Привет всем!

Возникла вот такая проблема. Надо мне одновременно работать с несколькими СОМ портами. Логика обработки данных для портов совершенно одинаковая. Создаю для каждого порта поток. Т.к. логика одинаковая, то например для записи в порт, использую для всех портов свою ф-ию SendMyData(). А вот как теперь обезопасить данные, если 2 потока будут одновременно вызывать эту ф-ию? Если взять ее в крит. секцию, то все будет работать медленно, так как ф-ии записи и чтения из порта довольно медленные и будут тормозить остальные потоки. Посоветуйте плиз, как это лучше реализовать.

Спасибо.
Re: Как их сделать безопасными?
От: Willi  
Дата: 30.05.01 12:03
Оценка:
Здравствуйте Serge

Ну если эта функция не использует никаких глобальных переменных, то
никаких критических секций не надо, поскольку все локольные переменные
и параметры располагаются на стеке.
\/\/i||i
Re[2]: Как их сделать безопасными?
От: Serge Чехия  
Дата: 31.05.01 05:27
Оценка:
Здравствуйте Willi, вы писали:

W>Здравствуйте Serge


W>Ну если эта функция не использует никаких глобальных переменных, то

W>никаких критических секций не надо, поскольку все локольные переменные
W>и параметры располагаются на стеке.


Т.е. я так понимаю, что если 2 потока одновременно выполняют одну и ту же функцию, то в каждый момент времени эта функция работает с данными 1 потока, а при переключении на другой поток получает данные другого потока?
Re[3]: Как их сделать безопасными?
От: Willi  
Дата: 31.05.01 06:18
Оценка:
Здравствуйте Serge, вы писали:

S>Т.е. я так понимаю, что если 2 потока одновременно выполняют одну и ту же функцию, то в каждый момент времени эта функция работает с данными 1 потока, а при переключении на другой поток получает данные другого потока?


Что значит "с даннымим одного потока" ?
У всех потоков одного процесса память общая а значит и данные общие.
Разделение данных по потоком это всегда условность.
Ты сам должен решить куда и какой поток будет лазить.
И если два потока лезут в одно место, значит нужно ставить критические
секции.

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


например

struct MY_DATA
{
...
};

struct LIST_ITEM
{
MY_DATA data;
LIST_ITEM* pNext;
};

int thread_main(...)
{
LIST_ITEM* pHead;

pHead = new LIST_ITEM;
...
LIST_ITEM* pTail = pHead;

for(...)
{
MYDATA data;
...
pTail = add_to_list(pTail, &data);
}
...
}

LIST_ITEM* add_to_list(LIST_ITEM* pTail, MY_DATA* pData)
{
pTail->pNext = new LIST_ITEM;
pTail->pNext->pNext = NULL;
memcpy(&(pTail->pNext->pData), pData, sizeof(MY_DATA));
return pTail->pNext;
}

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

однако, если мы захотим вынести LIST_ITEM* pHead в область глобальных
переменных и разрешим доступаться к списку из всех потоков
во тут-то и придется задуматься о снхронизации

Ф-у-у-у-х
Надеюсь теперь понятно :)
\/\/i||i
Re[4]: Как их сделать безопасными?
От: Serge Чехия  
Дата: 31.05.01 09:07
Оценка:
Спасибо Willi !

Уже понял в чем дело.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.