имееться объект в котором есть N полей типа int
обновление полей происходит по сигналу извне в отдельном потоке в дружественной функции с использованием CRITICAL_SECTION
подскажите пожалуйста как можно организовать обновление если
в 99.99% поля используються на чтение а не на запись
сама функция которая использует эти поля выполняеться достаточно долго те входить в ее начале в CRITICAL_SECTION не очень хорошо
делать каждый раз локальные копии полей вначале функции и использовать их не очень хорошо так как за минуту функция может быть вызвана несколько тысячь раз
Здравствуйте, sergey2b, Вы писали:
S>имееться объект в котором есть N полей типа int S>обновление полей происходит по сигналу извне в отдельном потоке в дружественной функции с использованием CRITICAL_SECTION
S>подскажите пожалуйста как можно организовать обновление если S>в 99.99% поля используються на чтение а не на запись S>сама функция которая использует эти поля выполняеться достаточно долго те входить в ее начале в CRITICAL_SECTION не очень хорошо S>делать каждый раз локальные копии полей вначале функции и использовать их не очень хорошо так как за минуту функция может быть вызвана несколько тысячь раз
а теперь все это по русски, указывая какая функция пишет/читает, что и как долго делает, и ...
Здравствуйте, sergey2b, Вы писали:
S>имееться объект в котором есть N полей типа int...
Отложенный вызов?
По сигналу извне создаешь копию объекта, обновляешь ее и взводишь событие "Есть обновление", перед расчетом занимаешь секцию проверяешь событие, обновляешь объект в случае необходимости, освобождаешь секцию и делаешь расчет.
Здравствуйте, sergey2b, Вы писали:
S>имееться объект в котором есть N полей типа int S>обновление полей происходит по сигналу извне в отдельном потоке в дружественной функции с использованием CRITICAL_SECTION
S>подскажите пожалуйста как можно организовать обновление если S>в 99.99% поля используються на чтение а не на запись S>сама функция которая использует эти поля выполняеться достаточно долго те входить в ее начале в CRITICAL_SECTION не очень хорошо S>делать каждый раз локальные копии полей вначале функции и использовать их не очень хорошо так как за минуту функция может быть вызвана несколько тысячь раз
кажется понял что вам надо.
заводим 2 набора полей, один для чтения, другой для обновлений.
после обновления, наборы подменяем местами. можно использовать interlocked exchange указателей
и обеспечиваем, чтобы функция использовала только один набор на время своего выполнения
Здравствуйте, ilnar, Вы писали:
I>кажется понял что вам надо. I>заводим 2 набора полей, один для чтения, другой для обновлений. I>после обновления, наборы подменяем местами.
Не прокатит. Один читающий поток может сейчас использовать один набор, а другой — второй. И что тогда обновлять?
I>можно использовать interlocked exchange указателей
Здравствуйте, remark, Вы писали:
R>Здравствуйте, ilnar, Вы писали:
I>>кажется понял что вам надо. I>>заводим 2 набора полей, один для чтения, другой для обновлений. I>>после обновления, наборы подменяем местами.
R>Не прокатит. Один читающий поток может сейчас использовать один набор, а другой — второй. И что тогда обновлять?
тогда замену наборов осуществлять в read/write блокировке, обновляющий поток будет захватывать write блокировку для замены, и ждать пока все read блокированные отпустят второй набор
I>>можно использовать interlocked exchange указателей
R>Смысл?
R>
Здравствуйте, ilnar, Вы писали:
I>>>кажется понял что вам надо. I>>>заводим 2 набора полей, один для чтения, другой для обновлений. I>>>после обновления, наборы подменяем местами.
R>>Не прокатит. Один читающий поток может сейчас использовать один набор, а другой — второй. И что тогда обновлять?
I>тогда замену наборов осуществлять в read/write блокировке, обновляющий поток будет захватывать write блокировку для замены, и ждать пока все read блокированные отпустят второй набор
А вот это попробуйте (с)
I>>>можно использовать interlocked exchange указателей
R>>Смысл?
Здравствуйте, sergey2b, Вы писали:
S>имееться объект в котором есть N полей типа int S>обновление полей происходит по сигналу извне в отдельном потоке в дружественной функции с использованием CRITICAL_SECTION
S>подскажите пожалуйста как можно организовать обновление если S>в 99.99% поля используються на чтение а не на запись S>сама функция которая использует эти поля выполняеться достаточно долго те входить в ее начале в CRITICAL_SECTION не очень хорошо S>делать каждый раз локальные копии полей вначале функции и использовать их не очень хорошо так как за минуту функция может быть вызвана несколько тысячь раз
вместо CRITICAL_SECTION используйте CSWMRG (Single Writer Multiple Reader Guard) от Рихтера
он же Slim Reader/Writer SRW Locks в Vista+
Здравствуйте, ilnar, Вы писали:
I>кажется понял что вам надо. I>заводим 2 набора полей, один для чтения, другой для обновлений.
спасибо всем ответившим
надо один writer и несколько readers
количество полей небольшое поэтому могу делать сколько угодно копий главный критерий что бы writer блокировал readers на минимально возможное время