Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по критическим секциям, правильно ли использую? 
:(
    Опции темы
Андреy
Дата 16.3.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 9.4.2008

Репутация: нет
Всего: нет



Добрый день. Прошу консультации.
У меня DLL COM сервер, апартаментная модель потоков. Клиент обращается к серверу одновременно в разных потоках. В реализации сервера у меня остались функции, которые не удается поместить в какой-либо класс - короче, есть глобальные функции и проблема одновременного доступа к данным из разных потоков.
Решил использовать критические секции, и тут вопрос.
1. Есть функции типа void - обработали данные и все. Тут все ясно и я делаю так:
Код

void InitDefaultConfig(t_P4LT_Config* pP4LTConfig)
{
         // добавлен вход в критическую секцию, т.к. предполагается
    // одновременный вызов ф-ций драйвера в разных потоках 
    CRITICAL_SECTION CriticalSect;
    InitializeCriticalSection(&CriticalSect);
    __try
    {
        EnterCriticalSection(&CriticalSect);

        MEMSET(pP4LTConfig, 0, sizeof(*pP4LTConfig)); 

        // set the P4LT configuration version
        pP4LTConfig->configVersion = P4LT_CONFIGURATION_VERSION;
    }
   __finally 
    {
        LeaveCriticalSection(&CriticalSect);
    }
   DeleteCriticalSection(&CriticalSect);
}

2. Неясно с функциями, возвращающими значение. Начал было делать так:
Код

unsigned long getBitfieldValue(unsigned long ulBitfield, unsigned long ulBitmask)
{
    int iShift;
    CRITICAL_SECTION CriticalSect;
    InitializeCriticalSection(&CriticalSect);
    __try
    {
        EnterCriticalSection(&CriticalSect);
             iShift = getSetLSB(ulBitmask);

  __finally 
    {
        LeaveCriticalSection(&CriticalSect);
    }
    DeleteCriticalSection(&CriticalSect);
    return(ulBitfield & ulBitmask) >> iShift;
}

Но ведь это может привести к проблеме: 1-ый поток вошел с одними параметрами, отработала часть в критической секции, и хоп - вернуть значение не успели и залезает 2-ой поток. Получается, что блоком критической секции нужно обрамлять вызов таких функций, но вот такие функции у меня вызываются в десятках классах в различных местах. Как тут быть?
PM MAIL   Вверх
Lazin
Дата 16.3.2009, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



ты все не правильно делаешь
ты создаешь кр. секцию во время каждого нового вызова ф-ии, а нужно, что-бы кр. секция жила столько-же сколько и общие данные, которые она защищает.
То-есть сразу после создания объекта ты инициализируешь кр. секцию. Можно сделать ее членом класса объекта, который используется из разных потоков. А в ф-ии ты просто вызываешь EnterCriticalSection - LeaveCriticalSection
PM MAIL Skype GTalk   Вверх
Андреy
Дата 16.3.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 9.4.2008

Репутация: нет
Всего: нет



Спасибо за ответ. Кажется, я еще кое-что неправильно делаю (так ли это?). Зацепило слово "ОБЩИЕ". У меня то все данные разбиты по классам. Классы создаются при вызове COM-объекта, а в каждом потоке создается свой объект (apartment threading model). Меня смущало (и смущает) то, что остались глобальные функции, работающие с данными классов. Надо ли вообще мне заморачиваться с критическими секциями?
PM MAIL   Вверх
Lazin
Дата 16.3.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



если у тебя 2 потока могут изменять один и тот-же объект одновременно, то да
зы
я не силен в COM, но возможно тебе вообще ничего делать не нужно, COM все и так разрулит
PM MAIL Skype GTalk   Вверх
kolobok0
Дата 16.3.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 24.12.2008

Репутация: нет
Всего: 2



Цитата(Андреy @ 16.3.2009,  14:34)
Спасибо за ответ....

если мультитреад апартмен сервер (не дэлеле) - то да, может вызов приходить из разных процессов одновременно. если сингл - то нет на уровне кома выдаёться системное ожидание (посему долго не стоит "думать"). Вот с дэлеле сейчас не помню - возможно так же...


удачи Вам
(круглый)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.6543 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.