Односторонний лок
От: McSeem2 США http://www.antigrain.com
Дата: 15.07.10 22:27
Оценка:
Как мне сделать такой хитрый лок? Один тред — важный, другой — вспомогательный. Важный тред никогда не должен ждать вспомогательный. Наоборот, вспомогательный тред всегда обязан ждать, пока не выполнится некая критическая функция важного. Функция быстрая, поэтому на вспомогательном треде можно обойтись спин-локом. Подозреваю, что на атомик-операциях должно быть очень просто, но я в них не разбираюсь.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: Односторонний лок
От: c-smile Канада http://terrainformatica.com
Дата: 15.07.10 23:36
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Как мне сделать такой хитрый лок? Один тред — важный, другой — вспомогательный. Важный тред никогда не должен ждать вспомогательный. Наоборот, вспомогательный тред всегда обязан ждать, пока не выполнится некая критическая функция важного. Функция быстрая, поэтому на вспомогательном треде можно обойтись спин-локом. Подозреваю, что на атомик-операциях должно быть очень просто, но я в них не разбираюсь.


Если "важный" не ждет то что должно происходить если "важный" пишет в то время когда "вспомогательный" читает?

Самое простое и надежное это сократить время чтения "вспомогательным" данных.
Т.е. это все та же critical section на общий блок данных только вспомогательный для чтения делает локальную копию блока. А потом уже спокойно разбирается. В любом случае "важный" тред будет останавливаться, хотя бы для того чтобы дать поработать "вспомогательному". Тогда какая разница когда он это будет делать?
Re: Односторонний лок
От: A.Lokotkov Россия http://www.linkedin.com/pub/alexander-lokotkov/a/701/625
Дата: 16.07.10 03:08
Оценка:
Что предполагается делать, когда важный (далее writer) видит, что вспомогательный (далее reader) таки овладевает локом? Или совсем не важно?
bloß it hudla
Re[2]: Односторонний лок
От: McSeem2 США http://www.antigrain.com
Дата: 16.07.10 03:10
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Если "важный" не ждет то что должно происходить если "важный" пишет в то время когда "вспомогательный" читает?


Да, ты прав. Это больше похоже на лок-фри очередь — дело мутное.

CS>Самое простое и надежное это сократить время чтения "вспомогательным" данных.

CS>Т.е. это все та же critical section на общий блок данных только вспомогательный для чтения делает локальную копию блока. А потом уже спокойно разбирается. В любом случае "важный" тред будет останавливаться, хотя бы для того чтобы дать поработать "вспомогательному". Тогда какая разница когда он это будет делать?

Так и сделаю — то есть, создание локальной копии внутри лока, и обмен даными внутри лока. Тем более, что теперь критическую секцию можно инициализировать со спин-локом.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: Односторонний лок
От: March_rabbit  
Дата: 16.07.10 09:15
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Как мне сделать такой хитрый лок? Один тред — важный, другой — вспомогательный. Важный тред никогда не должен ждать вспомогательный. Наоборот, вспомогательный тред всегда обязан ждать, пока не выполнится некая критическая функция важного. Функция быстрая, поэтому на вспомогательном треде можно обойтись спин-локом. Подозреваю, что на атомик-операциях должно быть очень просто, но я в них не разбираюсь.


помнится, я такое делал с помощью двойного копирования данных.
суть в том, что массив данных от "непрерываемого потока" копируется прерываемым дважды. И производится сравнение результатов. Если обе копии одинаковы, то можно считать передачу данных удачной. Иначе — повторять чтение, пока две последовательные копии не будут одинаковы.
Тут есть определенные ограничения, как-то копирование массива должно быть "мгновенным" относительно задач "непрерываемого" потока.
Re[2]: Односторонний лок
От: McSeem2 США http://www.antigrain.com
Дата: 16.07.10 16:05
Оценка:
Здравствуйте, March_rabbit, Вы писали:

M_>помнится, я такое делал с помощью двойного копирования данных.

M_>суть в том, что массив данных от "непрерываемого потока" копируется прерываемым дважды. И производится сравнение результатов. Если обе копии одинаковы, то можно считать передачу данных удачной. Иначе — повторять чтение, пока две последовательные копии не будут одинаковы.
M_>Тут есть определенные ограничения, как-то копирование массива должно быть "мгновенным" относительно задач "непрерываемого" потока.

Не, это как-то мутно, ну его. Сделаю как c-smile сказал.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[2]: Односторонний лок
От: Кодт Россия  
Дата: 17.07.10 08:38
Оценка:
Здравствуйте, March_rabbit, Вы писали:

M_>суть в том, что массив данных от "непрерываемого потока" копируется прерываемым дважды. И производится сравнение результатов. Если обе копии одинаковы, то можно считать передачу данных удачной. Иначе — повторять чтение, пока две последовательные копии не будут одинаковы.


Проблема ABA
Перекуём баги на фичи!
Re: Односторонний лок
От: Vamp Россия  
Дата: 19.07.10 16:24
Оценка:
Я правильно понял, что имеется читатель, и писатель. И задача читателя — прочесть данные консистно, и это единственное требование? Если это так, то я знаю превосходное решение.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Вы прямо как Ферма :)
От: Аноним  
Дата: 19.07.10 19:05
Оценка: :))) :)
Здравствуйте, Vamp!

V>...я знаю превосходное решение.


Вы прямо как Ферма
Re[2]: Односторонний лок
От: McSeem2 США http://www.antigrain.com
Дата: 23.07.10 19:28
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Я правильно понял, что имеется читатель, и писатель. И задача читателя — прочесть данные консистно, и это единственное требование? Если это так, то я знаю превосходное решение.


Ну, примерно так. Только в более общем виде — в некой функции требуется осуществить обмен данными между тредами. Функция обмена — очень короткая по времени, типа скопировать десяток килобайт. Колись.

Хотя, я проверил — прекрасно работает и с локами на короткое время, особенно если инициализировать critical section со спин-локом.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[3]: Односторонний лок
От: Vamp Россия  
Дата: 23.07.10 19:44
Оценка:
MS>Колись.
Ну, это разновидность спин-лока. Данные представленны в виде: данные, счетчик. Писатель, ктогда ему надо что-то записать, просто записывает данные и инкрементирует счетчик.
Читатель, когда его что-то интересует, читает счетчик, читает данные и снова читает счетчик, сравнивая его значение с предыдщим. Если оно изменилось — данные невалидны, и надо перечитать.
Разумеется, у данного подхода есть границы применимости, основная — никто не гарантирует, что читатель вообще что-то когда-то прочтет. Но в своих границах это просто ураган по скорости.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Односторонний лок
От: McSeem2 США http://www.antigrain.com
Дата: 23.07.10 19:56
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Разумеется, у данного подхода есть границы применимости, основная — никто не гарантирует, что читатель вообще что-то когда-то прочтет. Но в своих границах это просто ураган по скорости.


Понятно. Для меня это не проблема, обмен данными требуется осуществлять довольно редко, типа 30 раз в секунду. Хотя и обычный, двусторонний лок работает нормально.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[5]: Односторонний лок
От: Vamp Россия  
Дата: 23.07.10 20:04
Оценка:
MS>Понятно. Для меня это не проблема, обмен данными требуется осуществлять довольно редко, типа 30 раз в секунду. Хотя и обычный, двусторонний лок работает нормально.
Тогда тебе и обычный лок будет в кайф. Преимущество моего метода — не тормозим на стандартных примитивах синхронизации, но с апдейтом 30 раз в секунду у тебя тормозить ничего не будет в любом случае.
Да здравствует мыло душистое и веревка пушистая.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.