URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7592
[ Назад ]

Исходное сообщение
"разрыв операции сигналом на х86 и АМД64"

Отправлено ghost_in_machine , 17-Сен-08 18:26 
Доброго времени суток.
Есть ли принципиальная возможность на х86 или AMD64 машинах разрыва операции massive[id]=val обрабочиком сигнала между вычислением адреса, куда положить val, и собственно самим помещением val по вычисленному адресу?
Спасибо.

Содержание

Сообщения в этом обсуждении
"разрыв операции сигналом на х86 и АМД64"
Отправлено angra , 18-Сен-08 01:39 
Зависит от компилятора, но на ассемблере это можно сделать одной процессорной инструкцией.

"разрыв операции сигналом на х86 и АМД64"
Отправлено ghost_in_machine , 18-Сен-08 08:43 
>Зависит от компилятора, но на ассемблере это можно сделать одной процессорной инструкцией.
>

Большое спасибо.


"разрыв операции сигналом на х86 и АМД64"
Отправлено Аноним , 18-Сен-08 21:47 
>Зависит от компилятора, но на ассемблере это можно сделать одной процессорной инструкцией.

Не всегда. Зависит от сложности элемента массива.

pthread_mutex специально для таких ситуаций.


"разрыв операции сигналом на х86 и АМД64"
Отправлено Michelnok , 19-Сен-08 12:30 
>Зависит от компилятора, но на ассемблере это можно сделать одной процессорной инструкцией.

... с префиксом lock.
Только мне кажется что топикстартер хочет сделать что-то плохое. Я бы на его месте не стал полагаться на атомарность такой операции.


"разрыв операции сигналом на х86 и АМД64"
Отправлено ghost_in_machine , 19-Сен-08 13:53 
Спасибо за ответы. Не могли бы вы пояснить, что значит «сложность массива»? Сделать эту процедуру безопасной никаких проблем нет, но меня ужасает количество установок/снятий блокировок в коде. В обработчике сигналов временами требуется перевыделять память под глобальные массивы, с которым работает остальная часть кода. Идея была такова, что если использовать адрес указателя на динамический массив и индекс элемента массива, то всех блокировок можно и не делать, массив всегда будет правильно вычисляться по формуле а-ля (*address_of_pointer_to_global_dynamic_massive)[id]=val, несмотря на то, что сам указатель меняет свое значение при появлении сигнала. Пробные пуски показали, что все ОК, теперь вот пытаюсь узнать, может ли вообще такая конструкция сбоить.

"разрыв операции сигналом на х86 и АМД64"
Отправлено Аноним , 19-Сен-08 14:36 
>Спасибо за ответы. Не могли бы вы пояснить, что значит «сложность массива»?

Я думал ты индекс меняешь в сигнале. Если элементы массива не примитивные, то смещение вычисляется сложно, и не всегда одной командой.

>В обработчике сигналов временами требуется перевыделять память
>под глобальные массивы, с которым работает остальная часть кода.

Вот это кошмар. Не надо выделять память в обработчике сигнала, если не хочешь проблем.
Ни brk ни mmap не входят в списов функций разрешёных обработчику сигнала.


>массив всегда
>будет правильно вычисляться по формуле а-ля (*address_of_pointer_to_global_dynamic_massive)[id]=val, несмотря на то, что
>сам указатель меняет свое значение при появлении сигнала.

Менять указатель в обработчике сигнала можно без блокировок.

>Пробные пуски показали,
>что все ОК, теперь вот пытаюсь узнать, может ли вообще такая
>конструкция сбоить.

Может.



"разрыв операции сигналом на х86 и АМД64"
Отправлено ghost_in_machine , 19-Сен-08 15:37 
>>Спасибо за ответы. Не могли бы вы пояснить, что значит «сложность массива»?
>
>Я думал ты индекс меняешь в сигнале. Если элементы массива не примитивные,
>то смещение вычисляется сложно, и не всегда одной командой.

опять же непонятно, что такое "примитивные элементы массива". Если размер елемента масива статичен и известен, то имеет ли какое-то значение что он из себя представляет?

>[оверквотинг удален]
>>будет правильно вычисляться по формуле а-ля (*address_of_pointer_to_global_dynamic_massive)[id]=val, несмотря на то, что
>>сам указатель меняет свое значение при появлении сигнала.
>
>Менять указатель в обработчике сигнала можно без блокировок.
>
>>Пробные пуски показали,
>>что все ОК, теперь вот пытаюсь узнать, может ли вообще такая
>>конструкция сбоить.
>
>Может.

н-да... неутешительно, пошел медитировать над извращением логики программы.


"разрыв операции сигналом на х86 и АМД64"
Отправлено Аноним , 19-Сен-08 17:39 
>опять же непонятно, что такое "примитивные элементы массива". Если размер елемента масива статичен и известен, то имеет ли какое-то значение что он из
>себя представляет?

Размер имеет значение. Смещение на лету считается для размеров в 1,2,4,8 байт. Для других размеров - необходимо считать смещение отдельно, то есть получается больше 1 операции.


"разрыв операции сигналом на х86 и АМД64"
Отправлено ghost_in_machine , 19-Сен-08 18:31 
>>опять же непонятно, что такое "примитивные элементы массива". Если размер елемента масива статичен и известен, то имеет ли какое-то значение что он из
>>себя представляет?
>
>Размер имеет значение. Смещение на лету считается для размеров в 1,2,4,8 байт.
>Для других размеров - необходимо считать смещение отдельно, то есть получается
>больше 1 операции.

Не знал. Спасибо за разъяснения.


"разрыв операции сигналом на х86 и АМД64"
Отправлено Аноним , 22-Сен-08 13:57 
>В обработчике сигналов временами требуется перевыделять память
>под глобальные массивы

Нельзя так делать ни в коем случае.


"разрыв операции сигналом на х86 и АМД64"
Отправлено vic , 19-Сен-08 15:43 
>Доброго времени суток.
>Есть ли принципиальная возможность на х86 или AMD64 машинах разрыва операции massive[id]=val
>обрабочиком сигнала между вычислением адреса, куда положить val, и собственно самим
>помещением val по вычисленному адресу?
>Спасибо.

а если подумать над тем что operator[]() вполне перегружаем, ы?


"разрыв операции сигналом на х86 и АМД64"
Отправлено ghost_in_machine , 19-Сен-08 16:57 
>>Доброго времени суток.
>>Есть ли принципиальная возможность на х86 или AMD64 машинах разрыва операции massive[id]=val
>>обрабочиком сигнала между вычислением адреса, куда положить val, и собственно самим
>>помещением val по вычисленному адресу?
>>Спасибо.
>
>а если подумать над тем что operator[]() вполне перегружаем, ы?

Спасибо, vic. Не могли бы вы пояснить свою мысль, я не понимаю какое отношение перегружаемость оператора имеет к вопросу.


"разрыв операции сигналом на х86 и АМД64"
Отправлено vic , 22-Сен-08 12:37 
>>>Доброго времени суток.
>>>Есть ли принципиальная возможность на х86 или AMD64 машинах разрыва операции massive[id]=val
>>>обрабочиком сигнала между вычислением адреса, куда положить val, и собственно самим
>>>помещением val по вычисленному адресу?
>>>Спасибо.
>>
>>а если подумать над тем что operator[]() вполне перегружаем, ы?
>
>Спасибо, vic. Не могли бы вы пояснить свою мысль, я не понимаю
>какое отношение перегружаемость оператора имеет к вопросу.

прямое, т.к. атомарности нифига не будет если используется не просто массив интов каких-нить, а что типа std::vector. Да и в случае массивов интов тоже гарантии нет. В методе оператора может быть и вывод на консоль засунут. А поручится за то что другой программист получивший ваш код в наследство не заменит ваш обычный массив на нечто более сложное с таким вот оператором, нельзя. Отсюда вывод - для атомарности всегда использовать locks/mutex предусмотренные стандартом.


"разрыв операции сигналом на х86 и АМД64"
Отправлено ghost_in_machine , 25-Сен-08 13:32 
Спасибо, коллеги, за ваши ответы. Похоже, единственное решение, увы, в извращении логики программы в сторону асинхронности выявления потребности и фактического выделения памяти. Не так красиво, не так эффективно, но никаких alloc-ов в обработчиках сигнала.