как организовать обновление
От: sergey2b ЮАР  
Дата: 09.07.10 08:57
Оценка:
имееться объект в котором есть N полей типа int
обновление полей происходит по сигналу извне в отдельном потоке в дружественной функции с использованием CRITICAL_SECTION

подскажите пожалуйста как можно организовать обновление если
в 99.99% поля используються на чтение а не на запись
сама функция которая использует эти поля выполняеться достаточно долго те входить в ее начале в CRITICAL_SECTION не очень хорошо
делать каждый раз локальные копии полей вначале функции и использовать их не очень хорошо так как за минуту функция может быть вызвана несколько тысячь раз
Re: как организовать обновление
От: ilnar Россия  
Дата: 09.07.10 09:21
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>имееться объект в котором есть N полей типа int

S>обновление полей происходит по сигналу извне в отдельном потоке в дружественной функции с использованием CRITICAL_SECTION

S>подскажите пожалуйста как можно организовать обновление если

S>в 99.99% поля используються на чтение а не на запись
S>сама функция которая использует эти поля выполняеться достаточно долго те входить в ее начале в CRITICAL_SECTION не очень хорошо
S>делать каждый раз локальные копии полей вначале функции и использовать их не очень хорошо так как за минуту функция может быть вызвана несколько тысячь раз

а теперь все это по русски, указывая какая функция пишет/читает, что и как долго делает, и ...
Re: как организовать обновление
От: kvasya  
Дата: 09.07.10 10:13
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>имееться объект в котором есть N полей типа int...


Отложенный вызов?

По сигналу извне создаешь копию объекта, обновляешь ее и взводишь событие "Есть обновление", перед расчетом занимаешь секцию проверяешь событие, обновляешь объект в случае необходимости, освобождаешь секцию и делаешь расчет.
Re: как организовать обновление
От: ilnar Россия  
Дата: 09.07.10 11:36
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>имееться объект в котором есть N полей типа int

S>обновление полей происходит по сигналу извне в отдельном потоке в дружественной функции с использованием CRITICAL_SECTION

S>подскажите пожалуйста как можно организовать обновление если

S>в 99.99% поля используються на чтение а не на запись
S>сама функция которая использует эти поля выполняеться достаточно долго те входить в ее начале в CRITICAL_SECTION не очень хорошо
S>делать каждый раз локальные копии полей вначале функции и использовать их не очень хорошо так как за минуту функция может быть вызвана несколько тысячь раз

кажется понял что вам надо.
заводим 2 набора полей, один для чтения, другой для обновлений.
после обновления, наборы подменяем местами. можно использовать interlocked exchange указателей
и обеспечиваем, чтобы функция использовала только один набор на время своего выполнения
Re[2]: как организовать обновление
От: remark Россия http://www.1024cores.net/
Дата: 09.07.10 11:50
Оценка:
Здравствуйте, ilnar, Вы писали:

I>кажется понял что вам надо.

I>заводим 2 набора полей, один для чтения, другой для обновлений.
I>после обновления, наборы подменяем местами.

Не прокатит. Один читающий поток может сейчас использовать один набор, а другой — второй. И что тогда обновлять?

I>можно использовать interlocked exchange указателей


Смысл?


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: как организовать обновление
От: ilnar Россия  
Дата: 09.07.10 12:02
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, ilnar, Вы писали:


I>>кажется понял что вам надо.

I>>заводим 2 набора полей, один для чтения, другой для обновлений.
I>>после обновления, наборы подменяем местами.

R>Не прокатит. Один читающий поток может сейчас использовать один набор, а другой — второй. И что тогда обновлять?


тогда замену наборов осуществлять в read/write блокировке, обновляющий поток будет захватывать write блокировку для замены, и ждать пока все read блокированные отпустят второй набор

I>>можно использовать interlocked exchange указателей


R>Смысл?


R>
Re[4]: как организовать обновление
От: remark Россия http://www.1024cores.net/
Дата: 09.07.10 12:04
Оценка:
Здравствуйте, ilnar, Вы писали:

I>>>кажется понял что вам надо.

I>>>заводим 2 набора полей, один для чтения, другой для обновлений.
I>>>после обновления, наборы подменяем местами.

R>>Не прокатит. Один читающий поток может сейчас использовать один набор, а другой — второй. И что тогда обновлять?


I>тогда замену наборов осуществлять в read/write блокировке, обновляющий поток будет захватывать write блокировку для замены, и ждать пока все read блокированные отпустят второй набор


А вот это попробуйте (с)

I>>>можно использовать interlocked exchange указателей


R>>Смысл?



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: как организовать обновление
От: Alexey Frolov Беларусь  
Дата: 09.07.10 14:25
Оценка: 2 (1)
Здравствуйте, 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+
Re[2]: как организовать обновление
От: sergey2b ЮАР  
Дата: 09.07.10 14:58
Оценка:
Здравствуйте, ilnar, Вы писали:

I>кажется понял что вам надо.

I>заводим 2 набора полей, один для чтения, другой для обновлений.

спасибо всем ответившим

надо один writer и несколько readers
количество полей небольшое поэтому могу делать сколько угодно копий главный критерий что бы writer блокировал readers на минимально возможное время
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.