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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.