Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Глобальные переменные в нитях


Страницы:   1 2

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]


> действителдьно ли юзать переменные в нитях неправильно?


Неправильна сама постановка вопроса о "неправильности".
Правильно или неправильно - это зависит от полного понимания происходящего при этом.


> чем это может грозить?


Минимум - "глюками".
Максимум - крахом нити и/или процесса.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо