Форум: "Основная";
Текущий архив: 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.039 c