Как мне сделать такой хитрый лок? Один тред — важный, другой — вспомогательный. Важный тред никогда не должен ждать вспомогательный. Наоборот, вспомогательный тред всегда обязан ждать, пока не выполнится некая критическая функция важного. Функция быстрая, поэтому на вспомогательном треде можно обойтись спин-локом. Подозреваю, что на атомик-операциях должно быть очень просто, но я в них не разбираюсь.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, McSeem2, Вы писали:
MS>Как мне сделать такой хитрый лок? Один тред — важный, другой — вспомогательный. Важный тред никогда не должен ждать вспомогательный. Наоборот, вспомогательный тред всегда обязан ждать, пока не выполнится некая критическая функция важного. Функция быстрая, поэтому на вспомогательном треде можно обойтись спин-локом. Подозреваю, что на атомик-операциях должно быть очень просто, но я в них не разбираюсь.
Если "важный" не ждет то что должно происходить если "важный" пишет в то время когда "вспомогательный" читает?
Самое простое и надежное это сократить время чтения "вспомогательным" данных.
Т.е. это все та же critical section на общий блок данных только вспомогательный для чтения делает локальную копию блока. А потом уже спокойно разбирается. В любом случае "важный" тред будет останавливаться, хотя бы для того чтобы дать поработать "вспомогательному". Тогда какая разница когда он это будет делать?
Здравствуйте, c-smile, Вы писали:
CS>Если "важный" не ждет то что должно происходить если "важный" пишет в то время когда "вспомогательный" читает?
Да, ты прав. Это больше похоже на лок-фри очередь — дело мутное.
CS>Самое простое и надежное это сократить время чтения "вспомогательным" данных. CS>Т.е. это все та же critical section на общий блок данных только вспомогательный для чтения делает локальную копию блока. А потом уже спокойно разбирается. В любом случае "важный" тред будет останавливаться, хотя бы для того чтобы дать поработать "вспомогательному". Тогда какая разница когда он это будет делать?
Так и сделаю — то есть, создание локальной копии внутри лока, и обмен даными внутри лока. Тем более, что теперь критическую секцию можно инициализировать со спин-локом.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, McSeem2, Вы писали:
MS>Как мне сделать такой хитрый лок? Один тред — важный, другой — вспомогательный. Важный тред никогда не должен ждать вспомогательный. Наоборот, вспомогательный тред всегда обязан ждать, пока не выполнится некая критическая функция важного. Функция быстрая, поэтому на вспомогательном треде можно обойтись спин-локом. Подозреваю, что на атомик-операциях должно быть очень просто, но я в них не разбираюсь.
помнится, я такое делал с помощью двойного копирования данных.
суть в том, что массив данных от "непрерываемого потока" копируется прерываемым дважды. И производится сравнение результатов. Если обе копии одинаковы, то можно считать передачу данных удачной. Иначе — повторять чтение, пока две последовательные копии не будут одинаковы.
Тут есть определенные ограничения, как-то копирование массива должно быть "мгновенным" относительно задач "непрерываемого" потока.
Здравствуйте, March_rabbit, Вы писали:
M_>помнится, я такое делал с помощью двойного копирования данных. M_>суть в том, что массив данных от "непрерываемого потока" копируется прерываемым дважды. И производится сравнение результатов. Если обе копии одинаковы, то можно считать передачу данных удачной. Иначе — повторять чтение, пока две последовательные копии не будут одинаковы. M_>Тут есть определенные ограничения, как-то копирование массива должно быть "мгновенным" относительно задач "непрерываемого" потока.
Не, это как-то мутно, ну его. Сделаю как c-smile сказал.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, March_rabbit, Вы писали:
M_>суть в том, что массив данных от "непрерываемого потока" копируется прерываемым дважды. И производится сравнение результатов. Если обе копии одинаковы, то можно считать передачу данных удачной. Иначе — повторять чтение, пока две последовательные копии не будут одинаковы.
Я правильно понял, что имеется читатель, и писатель. И задача читателя — прочесть данные консистно, и это единственное требование? Если это так, то я знаю превосходное решение.
Здравствуйте, Vamp, Вы писали:
V>Я правильно понял, что имеется читатель, и писатель. И задача читателя — прочесть данные консистно, и это единственное требование? Если это так, то я знаю превосходное решение.
Ну, примерно так. Только в более общем виде — в некой функции требуется осуществить обмен данными между тредами. Функция обмена — очень короткая по времени, типа скопировать десяток килобайт. Колись.
Хотя, я проверил — прекрасно работает и с локами на короткое время, особенно если инициализировать critical section со спин-локом.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
MS>Колись.
Ну, это разновидность спин-лока. Данные представленны в виде: данные, счетчик. Писатель, ктогда ему надо что-то записать, просто записывает данные и инкрементирует счетчик.
Читатель, когда его что-то интересует, читает счетчик, читает данные и снова читает счетчик, сравнивая его значение с предыдщим. Если оно изменилось — данные невалидны, и надо перечитать.
Разумеется, у данного подхода есть границы применимости, основная — никто не гарантирует, что читатель вообще что-то когда-то прочтет. Но в своих границах это просто ураган по скорости.
Здравствуйте, Vamp, Вы писали:
V>Разумеется, у данного подхода есть границы применимости, основная — никто не гарантирует, что читатель вообще что-то когда-то прочтет. Но в своих границах это просто ураган по скорости.
Понятно. Для меня это не проблема, обмен данными требуется осуществлять довольно редко, типа 30 раз в секунду. Хотя и обычный, двусторонний лок работает нормально.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
MS>Понятно. Для меня это не проблема, обмен данными требуется осуществлять довольно редко, типа 30 раз в секунду. Хотя и обычный, двусторонний лок работает нормально.
Тогда тебе и обычный лок будет в кайф. Преимущество моего метода — не тормозим на стандартных примитивах синхронизации, но с апдейтом 30 раз в секунду у тебя тормозить ничего не будет в любом случае.