Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

что за volatile?!

12K
13 августа 2005 года
Романтик
4 / / 13.08.2005
Всем привет.

Ситуация следующая. Пробую написать свой COM-объект. Вычитал, что при подсчете ссылок на объект для нормальной работы с потоками надо использовать WinApi функции IncterlockedIncrement() и InterlockedDecrement(). Они-то и не хотят работать. Автор книги компилировал свои программы в MS VS 5.0, и, как я полагаю, они прекрасно работали. Я использую MS VS .NET 7.1. Думаю, что из-за разницы в компиляторах и возникает эта проблема. Исходный код приблизительно такой:

[FONT=courier new]
class Component : public IUnknown ...
{
public:
...
... AddRef();
... Release();
...

private:
long m_cRef;
...
};

...

... Component::AddRef()
{
return InterlockedIncrement( &m_cRef );
}

... Component::Release()
{
... InterlockedDecrement( &m_cRef );
...
}
[/FONT]

При вызовах этих функций компилятор выдает ошибку, мол не могу прочитать память по такому-то адресу. А если заменить их на ++m_cRef и --m_cRef, то все работает нормально. В MSDN эти функции объявлены так:

[FONT=courier new]
LONG InterlockedDecrement( LONG volatile* Addend );

LONG InterlockedIncrement( LONG volatile* Addend );
[/FONT]

Не знаю точно, но, наверное, в 5-ой версии студии этих volatile не было. Что это такое и зачем нужно? Или проблема вовсе не в этом? Может, кто-нибудь объяснить? Буду очень благодарен.

P.S. Оська Windows 2003 Server
1.9K
13 августа 2005 года
solovey
113 / / 25.07.2004
Цитата:
Originally posted by Романтик
Всем привет.

Ситуация следующая. Пробую написать свой COM-объект. Вычитал, что при подсчете ссылок на объект для нормальной работы с потоками надо использовать WinApi функции IncterlockedIncrement() и InterlockedDecrement(). Они-то и не хотят работать. Автор книги компилировал свои программы в MS VS 5.0, и, как я полагаю, они прекрасно работали. Я использую MS VS .NET 7.1. Думаю, что из-за разницы в компиляторах и возникает эта проблема. Исходный код приблизительно такой:

[FONT=courier new]
class Component : public IUnknown ...
{
public:
...
... AddRef();
... Release();
...

private:
long m_cRef;
...
};

...

... Component::AddRef()
{
return InterlockedIncrement( &m_cRef );
}

... Component::Release()
{
... InterlockedDecrement( &m_cRef );
...
}
[/FONT]

При вызовах этих функций компилятор выдает ошибку, мол не могу прочитать память по такому-то адресу. А если заменить их на ++m_cRef и --m_cRef, то все работает нормально. В MSDN эти функции объявлены так:

[FONT=courier new]
LONG InterlockedDecrement( LONG volatile* Addend );

LONG InterlockedIncrement( LONG volatile* Addend );
[/FONT]

Не знаю точно, но, наверное, в 5-ой версии студии этих volatile не было. Что это такое и зачем нужно? Или проблема вовсе не в этом? Может, кто-нибудь объяснить? Буду очень благодарен.

P.S. Оська Windows 2003 Server


Спецификатор [color=#3366FF]volatile[/color] - это подсказка компилятору, что объект может изменять свое значение не описанным в языке образом, так что агрессивной оптимизации следует избегать.(из Страуструпа)

12K
14 августа 2005 года
Романтик
4 / / 13.08.2005
И как ты думаешь, почему сиё не хочет компилиться?
406
14 августа 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Романтик
И как ты думаешь, почему сиё не хочет компилиться?



Все должно еомпилится правильно,мо у тебя проблема не в этом? Покажи кода побольше,и как ты создаеш эти объекты.

1.9K
14 августа 2005 года
solovey
113 / / 25.07.2004
Цитата:
Originally posted by Романтик
И как ты думаешь, почему сиё не хочет компилиться?


попробуй так

 
Код:
LONG InterlockedIncrement(volatile LONG * Addend );
хотя проблема скорее всего в чем-то другом
9.0K
15 августа 2005 года
DarkMaster
36 / / 27.07.2005
Цитата:
Originally posted by solovey
попробуй так
 
Код:
LONG InterlockedIncrement(volatile LONG * Addend );
хотя проблема скорее всего в чем-то другом


короче говоря, если переменную пометить этим спецификатором, другая программа сможет свободно ее изменять

12K
16 августа 2005 года
Романтик
4 / / 13.08.2005
мда... ошибка как всегда была рядом. Оказывается в Release() сначала удалял объект, а потом возвращал его переменную =)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог