Форум
Unix
Тема
Как правильно задавать вопросы
B
I
abc
U
X
3
X
3
H1
H2
H3
H4
H5
H6
Asm
C/C++
C#
Erlang
Haskell
IDL
Java
Lisp
MSIL
Nemerle
ObjC
OCaml
Pascal
Perl
PHP
Prolog
Python
Ruby
Rust
SQL
VB
Здравствуйте, Ivych, Вы писали: I>Добрый вечер, форумчане! I>Имеется вопрос, есть в проекте (операционка QNX4.25) несколько разделяемых объектов памяти, для взаимодействия между процессами. Есть один писатель в каждую из них и несколько читателей, я написал несколько функций оберток вида: I>[code]void XXXX_ShmemLock() I>{ I> assert( g_Shmem ); I> sem_wait( &g_Shmem->lock ); I>} I>void XXXX_ShmemUnlock() I>{ I> assert( g_Shmem ); I> sem_post( &g_Shmem->lock ); I>} I>void XXXX_ShmemCopy( void *destination, const void *source, const size_t num ) I>{ I> XXXX_ShmemLock(); I> _disable(); I> memcpy( destination, source, num ); I> _enable(); I> XXXX_ShmemUnlock(); I>}[/code] I>Дальнейшие операции более высокого уровня, выполняются путем вызова функций-оберток, как пример приложу: I>[code]void XXXX_ReadADC( const ADCChannel_t channel, double *voltage ) I>{ I> assert( channel < ADC_ChannelsNum ); I>// *voltage = g_Shmem->Vin[channel]; I> XXXX_ShmemCopy( (void *)voltage, (const void *)&g_Shmem->Vin[channel], sizeof(g_Shmem->Vin[channel]) ); I>} I>void XXXX_WriteADC( const ADCChannel_t channel, const double voltage ) I>{ I> assert( channel < ADC_ChannelsNum ); I>// g_Shmem->Vin[channel] = voltage; I> XXXX_ShmemCopy( (void *)&g_Shmem->Vin[channel], (const void *)&voltage, sizeof(voltage) ); I>}[/code] I>P.S. Насколько рационален такой подход? I>Так вот, как видно в функции XXXX_ShmemCopy, копирование данных в область и из нее, производится вызовом memcpy, обернутым в семафор и дополнительным отключением прерываний на момент копирования, чтобы обеспечить атомарность операции. Есть ли вообще смысл в такой перестраховке на однопроцессорной системе? Минус в использовании _disable()/_enable() при больших объемах копирования (которых скорее всего не будет), на момент выполнения операции, стопорится работа всей системы, или если вызовов XXXX_ShmemCopy будет много (а их скорее всего будет много), то рискуем то и делать что бесконечно выключать/включать прерывания. Так же есть ли необходимость оборачивания простых операций вида "Область->переменная = что-то записать", понятное дело не делая справа от "=" сложных операций, будет ли такая операция выполнена атомарно?
Теги:
Введите теги разделенные пробелами. Обрамляйте в кавычки словосочетания с пробелами внутри, например:
"Visual Studio" .NET
Имя, пароль:
Загрузить
Нравится наш сайт?
Помогите его развитию!
Отключить смайлики
Получать ответы по e-mail
Проверить правописание
Параметры проверки …