Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

Thread.Terminated II.   Найти похожие ветки 

 
Тимохов ©   (2004-04-19 19:26) [0]

Прошу прощения за повтор вопроса, но все же разрешите задать его еще раз с целью получения точного ответа на следующий вопрос (в прошлом моем топике понять точный ответ сложно):

Правда ли что в методе TThread.Terminate установка значения поля FTerminated происходит без средств синхронизации (например, через критическую секцию) т.к. FTerminated имеет тип boolean и код FTerminated := True транслируется в ОДНУ асм инструкцию?


 
Тимохов ©   (2004-04-19 19:26) [0]

Прошу прощения за повтор вопроса, но все же разрешите задать его еще раз с целью получения точного ответа на следующий вопрос (в прошлом моем топике понять точный ответ сложно):

Правда ли что в методе TThread.Terminate установка значения поля FTerminated происходит без средств синхронизации (например, через критическую секцию) т.к. FTerminated имеет тип boolean и код FTerminated := True транслируется в ОДНУ асм инструкцию?


 
Romkin ©   (2004-04-19 19:31) [1]

>код FTerminated := True транслируется в ОДНУ асм инструкцию?
Млин, ну какая разница? Состояние переменной может измениться из одного предопределенного только в одно же другое предопределенное. Неважно, за сколько команд, как изменится - так и все :)
Можешь хоть int64 объявить, пусть за две инструкции изменяется, и когда >0 - терминируем.


 
Romkin ©   (2004-04-19 19:31) [1]

>код FTerminated := True транслируется в ОДНУ асм инструкцию?
Млин, ну какая разница? Состояние переменной может измениться из одного предопределенного только в одно же другое предопределенное. Неважно, за сколько команд, как изменится - так и все :)
Можешь хоть int64 объявить, пусть за две инструкции изменяется, и когда >0 - терминируем.


 
Romkin ©   (2004-04-19 19:35) [2]

То есть, в данном случае причиной действия является, собственно говоря, не значение переменной, а факт изменения значения
Поэтому синхронизация не нужна


 
Romkin ©   (2004-04-19 19:35) [2]

То есть, в данном случае причиной действия является, собственно говоря, не значение переменной, а факт изменения значения
Поэтому синхронизация не нужна


 
Тимохов ©   (2004-04-19 19:41) [3]


> Romkin ©   (19.04.04 19:35) [2]

Хорошо, понял.

Тогда уточнение: решился бы ты делать такое присвоение без синхронизации для типа LongInt и дли типа Byte?


 
Тимохов ©   (2004-04-19 19:41) [3]


> Romkin ©   (19.04.04 19:35) [2]

Хорошо, понял.

Тогда уточнение: решился бы ты делать такое присвоение без синхронизации для типа LongInt и дли типа Byte?


 
Romkin ©   (2004-04-19 19:51) [4]

Конечно. Если проверка именно на изменение :))
Я ж говорил, хоть longBOOL, хоть int64 с нулем сравнить.
Хоть массивв возьми и поставь условием, что если хоть один элемент >0 то терминуть :)


 
Romkin ©   (2004-04-19 19:51) [4]

Конечно. Если проверка именно на изменение :))
Я ж говорил, хоть longBOOL, хоть int64 с нулем сравнить.
Хоть массивв возьми и поставь условием, что если хоть один элемент >0 то терминуть :)


 
Игорь Шевченко ©   (2004-04-19 20:09) [5]

Хотелось бы услышать, зачем автор в течение двух веток поднимает этот вопрос - из интереса или надо какую-то реальную задачу решить ?


 
Игорь Шевченко ©   (2004-04-19 20:09) [5]

Хотелось бы услышать, зачем автор в течение двух веток поднимает этот вопрос - из интереса или надо какую-то реальную задачу решить ?


 
Romkin ©   (2004-04-19 20:10) [6]

А он копает исходный код и удивляется, править или нет? ;)
Статью, наверно, пишет :)))


 
Romkin ©   (2004-04-19 20:10) [6]

А он копает исходный код и удивляется, править или нет? ;)
Статью, наверно, пишет :)))


 
Тимохов ©   (2004-04-19 20:12) [7]


> Игорь Шевченко ©   (19.04.04 20:09) [5]

Рихтера изучаю. Решился наконец. Если что-то учу, то въедлив становлюсь.

Самый прикол, что пользовался потоками не однократно, но не особо задумывался о том, что пишу (т.е. писал на основе книг по дельфи а не по win api), при том как сейчас выясняется писал все корректно.

Вот и возник вопрос межпотокового взаимодействия.


 
Тимохов ©   (2004-04-19 20:12) [7]


> Игорь Шевченко ©   (19.04.04 20:09) [5]

Рихтера изучаю. Решился наконец. Если что-то учу, то въедлив становлюсь.

Самый прикол, что пользовался потоками не однократно, но не особо задумывался о том, что пишу (т.е. писал на основе книг по дельфи а не по win api), при том как сейчас выясняется писал все корректно.

Вот и возник вопрос межпотокового взаимодействия.


 
Тимохов ©   (2004-04-19 20:13) [8]


> Romkin ©   (19.04.04 20:10) [6]

Нет, статью не пишу - гранит грызу.


 
Тимохов ©   (2004-04-19 20:13) [8]


> Romkin ©   (19.04.04 20:10) [6]

Нет, статью не пишу - гранит грызу.


 
VMcL ©   (2004-04-19 20:16) [9]

>>Тимохов ©  (19.04.04 20:13) [8]

С гранитом поосторожней, зуби береги :)


 
VMcL ©   (2004-04-19 20:16) [9]

>>Тимохов ©  (19.04.04 20:13) [8]

С гранитом поосторожней, зуби береги :)


 
Игорь Шевченко ©   (2004-04-19 20:38) [10]


> Рихтера изучаю. Решился наконец.


Дело очень полезное. А какой именно момент в Рихтере кажется непонятным ?


 
Игорь Шевченко ©   (2004-04-19 20:38) [10]


> Рихтера изучаю. Решился наконец.


Дело очень полезное. А какой именно момент в Рихтере кажется непонятным ?


 
panov ©   (2004-04-19 22:18) [11]

>Romkin ©   (19.04.04 19:31) [1]
Млин, ну какая разница? Состояние переменной может измениться из одного предопределенного только в одно же другое предопределенное. Неважно, за сколько команд, как изменится - так и все :)
Можешь хоть int64 объявить, пусть за две инструкции изменяется, и когда >0 - терминируем.


Думаю, что если бы переменная FTerminated была типа String, то коллизии возникли бы при попытке перезаписи ее из разных потоков.


 
panov ©   (2004-04-19 22:18) [11]

>Romkin ©   (19.04.04 19:31) [1]
Млин, ну какая разница? Состояние переменной может измениться из одного предопределенного только в одно же другое предопределенное. Неважно, за сколько команд, как изменится - так и все :)
Можешь хоть int64 объявить, пусть за две инструкции изменяется, и когда >0 - терминируем.


Думаю, что если бы переменная FTerminated была типа String, то коллизии возникли бы при попытке перезаписи ее из разных потоков.


 
Тимохов ©   (2004-04-20 10:44) [12]


> Игорь Шевченко ©   (19.04.04 20:38) [10]

В действительности все понятно. Рихтера как выяснилось я уже изучал - лет 5 назад (другое издание) (во память, лечится пора :))))
Согласитесь, что каждый человек имеет свой способ изучения материала. Кто-то быстро нахватывается из большого количества областей, кто-то долго и глубоко копает одну тему, потом другую и т.д. Я из второй группы. Поэтому если уж начал потоки глубоко копать и пишу на дельфи => надо разобраться как дельфи работает с потоками. Вот именно этот момент меня и насторожил.

Отвечаю сам на свой вопрос.
Дома провел опыт: для переменных byte,word,longword,int64,ansistring из одного потока попеременно писал два варианта значений (обычно 0 и максимально для чисел, и "aaa" или "bbb" для строк) из другого потока читал. Ошибкой считалось если переменная имеет значение не равное ни одному из двух вариантов. Опыт проводил всю ночь. Резуальтат, как и ожидалось такой: для типов, присвоение значения которым или чтение значения осуществляется одной инструкцией процессора (т.е. это byte,word и longword) можно не пользоваться методами синхронизации. Для типов использующих две и более инструкции процессора синхронизация просто необходима.

Комментарии.
Насколько я понимаю, здесь все логично:
1. Процессор выполняет инструкции.
2. windows переключает потоки с помощью вытесняющей многозадачности.
3. windows не может разрвать одну инструкцию процессора - может переключать потоки между инструкциями.

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


 
Тимохов ©   (2004-04-20 10:44) [12]


> Игорь Шевченко ©   (19.04.04 20:38) [10]

В действительности все понятно. Рихтера как выяснилось я уже изучал - лет 5 назад (другое издание) (во память, лечится пора :))))
Согласитесь, что каждый человек имеет свой способ изучения материала. Кто-то быстро нахватывается из большого количества областей, кто-то долго и глубоко копает одну тему, потом другую и т.д. Я из второй группы. Поэтому если уж начал потоки глубоко копать и пишу на дельфи => надо разобраться как дельфи работает с потоками. Вот именно этот момент меня и насторожил.

Отвечаю сам на свой вопрос.
Дома провел опыт: для переменных byte,word,longword,int64,ansistring из одного потока попеременно писал два варианта значений (обычно 0 и максимально для чисел, и "aaa" или "bbb" для строк) из другого потока читал. Ошибкой считалось если переменная имеет значение не равное ни одному из двух вариантов. Опыт проводил всю ночь. Резуальтат, как и ожидалось такой: для типов, присвоение значения которым или чтение значения осуществляется одной инструкцией процессора (т.е. это byte,word и longword) можно не пользоваться методами синхронизации. Для типов использующих две и более инструкции процессора синхронизация просто необходима.

Комментарии.
Насколько я понимаю, здесь все логично:
1. Процессор выполняет инструкции.
2. windows переключает потоки с помощью вытесняющей многозадачности.
3. windows не может разрвать одну инструкцию процессора - может переключать потоки между инструкциями.

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


 
Матлабист   (2004-04-20 12:37) [13]


> Тогда уточнение: решился бы ты делать такое присвоение без
> синхронизации для типа LongInt и дли типа Byte?


LongInt --- да
Byte --- да
Int64 --- нет. Да и для флага Int64 многовато ;)


 
Матлабист   (2004-04-20 12:37) [13]


> Тогда уточнение: решился бы ты делать такое присвоение без
> синхронизации для типа LongInt и дли типа Byte?


LongInt --- да
Byte --- да
Int64 --- нет. Да и для флага Int64 многовато ;)


 
Игорь Шевченко ©   (2004-04-20 12:47) [14]


> windows не может разрвать одну инструкцию процессора -


Если инструкция процессора не разрываемая (такие тоже есть), то ее никто не может разорвать, ни windows ни любая другая программа.


 
Игорь Шевченко ©   (2004-04-20 12:47) [14]


> windows не может разрвать одну инструкцию процессора -


Если инструкция процессора не разрываемая (такие тоже есть), то ее никто не может разорвать, ни windows ни любая другая программа.


 
Тимохов ©   (2004-04-20 12:49) [15]


> Игорь Шевченко ©   (20.04.04 12:47) [14]

А что, правда, что ест разрываемые инструкции процессора?
Можно пример, на какую они хоть тему (может мне это на фиг и не нужно знать пока, т.к. врядли встречусь).


 
Тимохов ©   (2004-04-20 12:49) [15]


> Игорь Шевченко ©   (20.04.04 12:47) [14]

А что, правда, что ест разрываемые инструкции процессора?
Можно пример, на какую они хоть тему (может мне это на фиг и не нужно знать пока, т.к. врядли встречусь).


 
MBo ©   (2004-04-20 13:31) [16]

>Тимохов
сырой перевод, терминология хромает, однако об атомарности операций можно почитать:
http://mbo88.narod.ru/ToC.html


 
MBo ©   (2004-04-20 13:31) [16]

>Тимохов
сырой перевод, терминология хромает, однако об атомарности операций можно почитать:
http://mbo88.narod.ru/ToC.html


 
Игорь Шевченко ©   (2004-04-20 13:32) [17]

Тимохов ©   (20.04.04 12:49)

REP MOVSB например

Еще говорят, SSE инструкции, но точно не уверен, врать не хочу


 
Игорь Шевченко ©   (2004-04-20 13:32) [17]

Тимохов ©   (20.04.04 12:49)

REP MOVSB например

Еще говорят, SSE инструкции, но точно не уверен, врать не хочу


 
Тимохов ©   (2004-04-20 13:35) [18]

Всем спасибо - главное я для себя понял - одна неразрывная инструкция - можно без синхронизации.

Еще раз всем спасибо.


 
Тимохов ©   (2004-04-20 13:35) [18]

Всем спасибо - главное я для себя понял - одна неразрывная инструкция - можно без синхронизации.

Еще раз всем спасибо.



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

Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.045 c
1-1082589588
Demi
2004-04-22 03:19
2004.05.09
Что такое SetWallpaper


1-1082547148
Axil
2004-04-21 15:32
2004.05.09
Общий скрол окна и его фрейма


14-1082103832
juiceman
2004-04-16 12:23
2004.05.09
C++


3-1082016968
BAYES
2004-04-15 12:16
2004.05.09
select * from prod order by no


1-1082613994
EvgeniyR
2004-04-22 10:06
2004.05.09
Rave Reports





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский