Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.06.12;
Скачать: CL | DM;

Вниз

Потокобезопасность DecodeDate()   Найти похожие ветки 

 
antonn ©   (2011-03-03 15:10) [0]

Является ли DecodeDate() (из SysUtils) потокобезопасной? Там в DecodeDateFully() есть примерно следующий код:
var
     DayTable: PDayTable;
begin
DayTable := @MonthDays[Result];
while True do  begin
         I := DayTable^[M];


где MonthDays объявлена глобально:
type
 PDayTable = ^TDayTable;
 TDayTable = array[1..12] of Word;

const
 MonthDays: array [Boolean] of TDayTable =
   ((31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
    (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31));


Не будет корявок при доступе к этой константе из разных потоков?


 
clickmaker ©   (2011-03-03 15:17) [1]

> Не будет корявок при доступе к этой константе из разных
> потоков?

это же константа. С чего бы корявки возникнут при доступе только на чтение?


 
antonn ©   (2011-03-03 15:38) [2]

Не могу найти тему, недавно спрашивал, похожая ситуация была с константным массивом, Анатолий вроде говорил что могут быть затыки. Потому и переспрашиваю


 
Анатолий Вроде   (2011-03-03 15:45) [3]

>> Анатолий вроде говорил что могут быть затыки

Доступ к константам потокобезопасен. Затыков не будет.


 
antonn ©   (2011-03-03 16:12) [4]

а вот и старая темка http://delphimaster.net/view/15-1282149795


 
antonn ©   (2011-03-03 16:13) [5]

начиная с поста [33]


 
clickmaker ©   (2011-03-03 16:15) [6]

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


 
antonn ©   (2011-03-03 16:20) [7]


> там про изменяемые константы, насколько я понял.

там в начале юнита объявление и никакого изменения по коду, только использование. Почти то же что и у меня тут, потому и спрашиваю еще раз.


 
clickmaker ©   (2011-03-03 16:23) [8]

в любом деле надо не только на логику опираться, но и на здравый смысл.
Ты же в театр в каске не ходишь? Хотя там тоже с потолка что-нибудь упасть может


 
antonn ©   (2011-03-03 16:30) [9]

Я не достаточно знаю внутренности получаемой в дельфи программы, как она и что выделяет и хранит, как читает.
Хорошо бы Анатолий откоментировался, почему там "по сути это переменная", а в этой теме можно не защищать.


 
clickmaker ©   (2011-03-03 16:39) [10]

> Хорошо бы Анатолий откоментировался, почему там "по сути
> это переменная",

он уже там откомментировался. Потому что типизированная константа - на самом деле не константа


 
clickmaker ©   (2011-03-03 16:40) [11]

впрочем, это настраивается в проекте и директивой {$J+}


 
antonn ©   (2011-03-03 16:40) [12]

а MonthDays здесь не такая же?


 
Anatoly Podgoretsky ©   (2011-03-03 16:41) [13]


> antonn ©   (03.03.11 15:10)  

А где тут DecodeDate?


 
Anatoly Podgoretsky ©   (2011-03-03 16:44) [14]


> clickmaker ©   (03.03.11 16:15) [6]

Оно уже примерно 400 лет переменное, пока один месяц, но все же


 
Anatoly Podgoretsky ©   (2011-03-03 16:45) [15]


> antonn ©   (03.03.11 16:30) [9]
> Хорошо бы Анатолий откоментировался, почему там "по сути
> это переменная", а в этой теме можно не защищать.

Я уже высказывал свое фи по поводу констант, которые в отличии от здравого смысла не совсем уж и не изменяемые.


 
antonn ©   (2011-03-03 16:51) [16]


> А где тут DecodeDate?

Смотреть сверху вниз начиная с YearOf(), так нагляднее:
type
PDayTable = ^TDayTable;
TDayTable = array[1..12] of Word;

const
MonthDays: array [Boolean] of TDayTable =
  ((31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
   (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31));

function YearOf(const AValue: TDateTime):Word;
var LMonth,LDay:word;
begin
      DecodeDate(AValue,Result,LMonth,LDay);
end;

procedure DecodeDate(const DateTime: TDateTime; var Year, Month, Day: Word);
var Dummy:Word;
begin
     DecodeDateFully(DateTime, Year, Month, Day, Dummy);
end;

function DecodeDateFully(const DateTime: TDateTime; var Year, Month, Day, DOW: Word): Boolean;
...
var
...
  DayTable: PDayTable;
begin
  ...  
   Result := IsLeapYear(Y);
   DayTable := @MonthDays[Result];
   M := 1;
   while True do
       begin
         I := DayTable^[M];


 
Противный   (2011-03-03 18:10) [17]

>> Я уже высказывал свое фи по поводу констант

Анатолий, а скажите, до каких пор нам терпеть begin и end в Pascal? Это же просто безобразие какое-то!


 
Anatoly Podgoretsky ©   (2011-03-03 20:27) [18]

> Противный  (03.03.2011 18:10:17)  [17]

А я убью за отсутствие begin и end, я тут согласен с Виртом


 
Противный   (2011-03-03 21:10) [19]

>> Anatoly Podgoretsky ©   (03.03.11 20:27) [18] <...>убью<...>

Это угроза? То есть, если молчать, то начало и конец так и останутся. А если ратовать за отмену, то придет Анатолий и убьет. И в том, и в другом случаях, получается - на всю жизнь. Разве что, в первом случае, можно надеяться, что хотя бы жизнь будет длинной. Но конец наступит обязательно.

Или смерть, или безнадега, а потом все равно смерть.

To be or not to be?
There is no question.

This is the end,
My only friend, the end<...>
Father, yes son, I want to kill you.

http://www.youtube.com/watch?v=QHFK1yKfiGo



Страницы: 1 вся ветка

Текущий архив: 2011.06.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
6-1237876024
Alex_C
2009-03-24 09:27
2011.06.12
ClientSocket + TThread = ошибка при завершении программы


3-1260193959
Бульбаш
2009-12-07 16:52
2011.06.12
Как правильно получить имя поля по дабл-клику на ячейке


2-1299173751
Leon-Z
2011-03-03 20:35
2011.06.12
Поиск 2 одинаковых элементов в массиве.


2-1299227899
Leon-Z
2011-03-04 11:38
2011.06.12
Многозадачность. TThread.


15-1298291318
Baks
2011-02-21 15:28
2011.06.12
Уникальный идентификтор компьютера