C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
_disable() как объект синхронизации?
Георгий
Отправлено: 17.09.2003, 22:56


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



люди меня конкретно клинит:

допустимо ли использование
CODE

_disable()
<доступ к объектам в разделяемой памяти>
_enable()

или надо, как и все нормальные люди, использовать семафоры?

PS. сервак qnx.org.ru лежит (они, что там в серверной свет на ночь выключают? smile.gif), поэтому имейте ввиду, что у меня кроме семафоров ничего нет.

Отредактировано Георгий — 17/09/2003, 23:59
Asher
Отправлено: 18.09.2003, 08:32


Мастер участка

Группа: Модератор
Сообщений: 550



Это вроде к программированию в DOS (и иже с ними) относится?
Там такое проходило, так как кроме как по прерыванию никто твою программу прервать не мог, и если ты их запретил, то все OK. Там правда еще было NMI, но по хорошему аппаратные прерывания, да еще такое как NMI, не должны где не попадя лазить biggrin.gif
P.S. Интересно, что это за ограничения на количество смайликов в мессагах. Мне вот только что не дали два! смайлика запостить???

Отредактировано Asher — 18/09/2003, 10:36
Георгий
Отправлено: 18.09.2003, 22:27


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Это, как на странно, относится к QNX4.25 в нём, как сегодня проверил, после _disable() и до _enable() отключаются прерывания (хотя кто его знает, на что загрузчик поменял команду cli, которая вместо вызова _disable() вставляется), что приводит к отключению всего, что только отключается — даже переключение между консолями не работает. Хотя и это защищённый режим (не flat — задача может состоять из нескольких сегментов(них*ра себе задача, если ей одного сегмента в 4GB мало!)) но ОС такие вольности позволяет.
какими способами я только не вешал этот QNX, да как он только не вис... Это не винды, которые даже на глупости программиста смотрят снисходительно, тут код должен работать как часы (не те, которые за 500р, а нормальные), а уж ОС, в отличие от винды, сама не "сломается"...
я тут ГЛЮК искал, вот и на этот _disable() было подозрние, что он не сериализует работу задач, но, как сегодня выяснил, дело было в другом (возьмите пиво, фисташки и кресло поудобнее — щаз будет долгий рассказ):
работал с общей памятью (POSIX shm_*), к которой обращались, все кому не лень (ну на самом деле только те, кому это надо) и в один прекрасный момент всё висло ха**р. Долго копался (2 дня) обнаружил, что индекс хвоста одного кольцевого буфера сбивается и устанавливается равным числу вроде 106xxxxxxx которое я сначала принял за глюк одновременного доступа к памяти и косо стал смотреть на _disable(), но это значение (106xxxxxxx) от запуска к запуску постоянно менялось (что для глюка не удивительно), но всё время в большую сторону и всего на +100...500 (что для глюка очень странно). При ближайшем рассмотрении оказалось, что это текущая дата в секундах (ну от 197x какого-то года). Что меня повергло в шок — я время в явном виде никуда не пишу. Проверка адресов с которыми идёт работа и т.п. ничего не дала — все адреса и индексы в порядке... Но ГЛЮК есть. Стационарный глюк (при записи 171-го элемента массива он происходил). И тут меня осенило — адрес этого элемента какой-то подозрительный 0x66FFC — на границе страницы разделяемой памяти, а элемент массива (структура) по размерам больше, чем до конца этой страницы оставалось и то, что не помещалось в эту страницу, аккуратно заворачивалось на её начало! (бл*) А там БЫЛИ и индексы и размеры массива, а теперь элемент структуры, а именно время ohmy.gif Сделал простенькую програмку, в которой эта ситуация должна была бы воспроизводится, но, увы, там всё работало как надо. Со словами "ну и х** с ней" я установил размер буфера в 110 элементов (т.е. что бы всё на одну страницу укладывалось), потестил передачу между 5 узлами — всё ок — никаких вылетов и прочих глюков.
да, блин, возможности улыбаться от души нас лишили — мне тоже больше одного не дали на днях вставить

ohmy.gif wink.gif biggrin.gif А они вставились, хотя только 3 подряд вставились, а 6 не захотели (кол-во смайликов превышает норму)

Отредактировано Георгий — 19/09/2003, 23:31
Admin
Отправлено: 19.09.2003, 15:14


Владимир

Группа: Администратор
Сообщений: 1190



Сколько угодно вставляйте ! biggrin.gif biggrin.gif biggrin.gif

Вернуться в Вопросы программирования в C++Builder