![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глобальные переменные в нитях
SpellCaster © (2007-02-26 12:37:00)Всем привет! Просветите, пожалуйста, насчёт использования глобальных переменных в нитях. Я-то всегда считал, что их можно беспрепятственно применять, если производится только чтение, но почитал одну ветку здесь и засомневался. Так действителдьно ли юзать переменные в нитях неправильно? А чем это может грозить?
Сергей М. (2007-02-28 14:05:00) [21]
> SpellCaster (28.02.07 13:32) [13]
А что тебя так заклинило именно на глоб.переменных ?
Существует масса иных способов заставить поток изменить хот выполнения алгоритма..
SpellCaster (2007-02-28 13:32:00) [22]И еще вопросик про критические секции. Насколько я понял, покопавшись в сорсах VCL, их можно применять в любой процедуре. Вот такой способ - нормально?
procedure Log(s: string);
begin
Logger.Enter;
try
FormMain.Memo1.Lines.Add(s);
finally Logger.Leave; end;
end;
...
...Thread.Execute...
...
Log('Hi');
...
end
Также я не понял, какой смысл лочить в следующем фрагменте
function TCustomWinSocket.GetLocalAddress: string;
var
SockAddrIn: TSockAddrIn;
Size: Integer;
begin
Lock; // синоним Critical.Enter
try
Result := '';
if FSocket = INVALID_SOCKET then Exit;
Size := SizeOf(SockAddrIn);
if getsockname(FSocket, SockAddrIn, Size) = 0 then
Result := inet_ntoa(SockAddrIn.sin_addr);
finally
Unlock; // синоним Critical.Leave
end;
end;
SpellCaster (2007-02-28 13:08:00) [23]> [9] Сергей М. © (28.02.07 11:30)
> [10] DrPass © (28.02.07 11:32)
Да, про строковые как-то не подумал.
> [11] Tor © (28.02.07 12:01)
Наверно, так и сделаю - приостановлю потоки на время изменения натсроек. Многопоточность нужна, т.к. это сетевое приложение, там куча всего качается и отсылается. С потоками раньше особо работать не приходилось, только на Яве, но на Яве это всё так завуалировано, что можно не париться про взаимодействие.
Tor (2007-02-28 12:01:00) [24]Сцуть заключается в следующем, нельзя читать когда пишут. Если настройки меняются тока впи закрытии окна, ну так останови поток запиши и двигай дальше. А вообще 10-раз обдумай целесообразность многопоточности, т.к. это сильно усложняет код проги, хотя по началу это не заметно. в конце концов критические секции это не долго. :)
DrPass (2007-02-28 11:32:00) [25]
> Кстати, а можете просветить вкратце: в чём собственно сама
> проблема наложения чтения/записи? Ведь в конечном итоге
> процессор всё равно выполняет только одну операцию в каждый
> конкретный момент времени.
Вполне конкретная - чтобы сохранить новое значение, например, в строковую переменную, процессору нужно выполнить сотни операций, вплоть до выделения нового блока памяти из кучи. И вероятность, что контекст потока переключится именно в это время, достаточно велика.
Сергей М. (2007-02-28 11:30:00) [26]
> Ведь в конечном итоге процессор всё равно выполняет только
> одну операцию в каждый конкретный момент времени.
Присвоение значения строковой переменной - это далеко не одна процессорная операция.
SpellCaster (2007-02-28 11:26:00) [27]Кстати, а можете просветить вкратце: в чём собственно сама проблема наложения чтения/записи? Ведь в конечном итоге процессор всё равно выполняет только одну операцию в каждый конкретный момент времени.
> [5] Игорь Шевченко © (26.02.07 17:46)
А есть ссылочка?
SpellCaster (2007-02-28 11:23:00) [28]Поясняю ситуацию. Есть некий набор переменных, представляющий собой настройки проги. Они меняются только после закрытия формы настроек, в процессе работы проги они постоянны. По-моему, юзать их в потоках вполне безопасно - или я не прав? Просто критикалы или синхрониз юзать на каждое применение переменной не хочется. Можно, конечно, скопировать настройки в локальные переменные потока, но это тоже замороченный метод.
Anatoly Podgoretsky (2007-02-27 00:25:00) [29]> SpellCaster (26.02.2007 12:37:00) [0]
> Я-то всегда считал, что их можно беспрепятственно применять, если производится только чтение,
Это уже константа, а не переменная.
Игорь Шевченко (2007-02-26 17:46:00) [30]
> А какой лучший способ взаимодействия главного и побочного
> потоков?
Рихтер целую главу (может, и не одну) написал про механизмы взаимодействия потоков в книжке "Windows для профессионалов". Может, его почитать ?
Степан (2007-02-26 17:41:00) [31]А какой лучший способ взаимодействия главного и побочного потоков? Я, например, использовал только PostMessage. Может есть другие способы?
DrPass (2007-02-26 12:58:00) [32]
> Я-то всегда считал, что их можно беспрепятственно применять,
> если производится только чтение
Если речь идет об атомарной переменной (операции с которыми делаются "за один заход"), то можно - ничего с ней не сделается во время чтения. Со сложными типами следует быть осторожнее, тут уже все от логики приложения зависит. Если для чтения следует выполнить много операций, и есть другие потоки, которые могут что-либо писать туда - это действительно чревато ошибками.
clickmaker (2007-02-26 12:42:00) [33]критические секции юзай
потому как то, что ты читаешь, в этот же момент кто-то может менять
Сергей М. (2007-02-26 12:42:00) [34]
> действителдьно ли юзать переменные в нитях неправильно?
Неправильна сама постановка вопроса о "неправильности".
Правильно или неправильно - это зависит от полного понимания происходящего при этом.
> чем это может грозить?
Минимум - "глюками".
Максимум - крахом нити и/или процесса.