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

Вниз

TTread + Terminate.   Найти похожие ветки 

 
Digitman ©   (2004-04-18 11:26) [40]


> Игорь Шевченко


а про кэш-арбитр ты почему-то умолчал)


 
Anatoly Podgoretsky ©   (2004-04-18 11:35) [41]

В данном конкретном примере FTerminated является приватным полем объекта, ни один другой поток не имеет прямого доступа до него. В каком бы контенсте не был вызван метод, сам поток пишет и читает жто поле, к тому же атомарная операция.


 
Verg ©   (2004-04-18 12:32) [42]


> Игорь Шевченко ©   (17.04.04 21:21) [38]
> KSergey ©   (17.04.04 07:10)
> Verg ©   (17.04.04 13:07)
>
> Вопрос на засыпку: имеется двухпроцессорная система. На
> одном процессе один поток выполняет машинную команду записи
> байта в оперативную память, на другом процессоре другой
> поток в это же время выполняет чтение байта из оперативной
> памяти по этому адресу. Что будет записано и что будет прочитано
> ?


Интереснее другое. Два потока пытаются одновременно инкрементировать ячейку памяти (inc [esi]). Я думаю, что вот тут как раз и будет четко видна разница однопроцессорной от многопроцессорной.
>1 процессора - есть вероятность, что ячейка синкрементируется на единицу, хотя по логике - должна на 2, т.к. между чтением старого значения и записью нового (+1) шина свободна и другой процессор может прочитать старое значение.

Ты это имел ввиду?

вот для этого и пишут lock inc [esi] (InterLockedIncrement).


 
Verg ©   (2004-04-18 12:39) [43]


> Что будет записано и что будет прочитано
> > ?


В байте до этого было число Y.
Записано будет то, что первый поток хотел записать (X).
А вот второй поток может причитать и X и Y с вероятностью 50/50.

Правильно?


 
Master Denis   (2004-04-18 19:30) [44]

А не проще написать прогу, которая будет только присваиваить скажем $ffffff... а затем тудаже $0000..., а в доп. потоке читать эту переменную.
Если хть раз прочитает что-нить отличное от этих двух значений - значит вполне возможно перекличение между потоками в момент записи части переменнной....
Сейчас пойду писать...


 
Романов Р.В. ©   (2004-04-19 08:19) [45]

Anatoly Podgoretsky ©   (18.04.04 11:35) [41]
Потрясающая оперативность. Ответ на вопрос спустя 2 суток после этого:

Тимохов ©   (16.04.04 15:58) [27]
Сим ответом и удовлетворю свой интерес.
Всем спасибо.


Браво...


 
KSergey ©   (2004-04-19 09:02) [46]

> [38] Игорь Шевченко ©   (17.04.04 21:21)
> Вопрос на засыпку: имеется двухпроцессорная система. На
> одном процессе один поток выполняет машинную команду записи
> байта в оперативную память, на другом процессоре другой
> поток в это же время выполняет чтение байта из оперативной
> памяти по этому адресу. Что будет записано и что будет прочитано?

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

Но все же мне думается, что не приходится задумываться о том один процессор или несколько в системе, во всяком случае при программировании под готовую OC: в противном случае, уверен, в книгах кроме проблем с потоками упоминались бы еще и проблемы написания кода под многопроцессорные системы, а мне такое не встречалось. Может не те книжки читал?


 
Anatoly Podgoretsky ©   (2004-04-19 09:10) [47]

Романов Р.В. ©   (19.04.04 08:19) [45]
Да какая разница когда, иногда бывают ответы и несколько месяцев спустя.


 
Игорь Шевченко ©   (2004-04-19 11:59) [48]

[40] Digitman ©   (18.04.04 11:26)

:)) Ну вот, такой вопрос был хороший...

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

Verg ©   (18.04.04 12:39)

Да, разумеется, так и произойдет, первый поток запишет, то, что хотел, второй прочитает содержимое в зависимости от того, кому первому арбитр памяти разрешит доступ к ячейке.

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


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


> Anatoly Podgoretsky ©   (18.04.04 11:35) [41]


> В данном конкретном примере FTerminated является приватным
> полем объекта, ни один другой поток не имеет прямого доступа
> до него. В каком бы контенсте не был вызван метод, сам поток
> пишет и читает жто поле, к тому же атомарная операция.

Анатолий.
Что-то странное вы говорите. Какая разница, что поле приватное. Реально читают и пишут то разные потоки.

Скорее всего здесь дело в атамарности.



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

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

Наверх




Память: 0.56 MB
Время: 0.074 c
14-1082197153
Тимур
2004-04-17 14:19
2004.04.11
Counter-strike через модем


14-1079082188
PaRL
2004-03-12 12:03
2004.04.11
Djvu


3-1082049671
Koba
2004-04-15 21:21
2004.04.11
Запросы


1-1080117589
alex123
2004-03-24 11:39
2004.04.11
Как запретить смену страницы а PageControl


1-1082802340
csr
2004-04-24 14:25
2004.04.11
Своя надпись на TListView