![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Андреy |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 9.4.2008 Репутация: нет Всего: нет |
Добрый день. Прошу консультации.
У меня DLL COM сервер, апартаментная модель потоков. Клиент обращается к серверу одновременно в разных потоках. В реализации сервера у меня остались функции, которые не удается поместить в какой-либо класс - короче, есть глобальные функции и проблема одновременного доступа к данным из разных потоков. Решил использовать критические секции, и тут вопрос. 1. Есть функции типа void - обработали данные и все. Тут все ясно и я делаю так:
2. Неясно с функциями, возвращающими значение. Начал было делать так:
Но ведь это может привести к проблеме: 1-ый поток вошел с одними параметрами, отработала часть в критической секции, и хоп - вернуть значение не успели и залезает 2-ой поток. Получается, что блоком критической секции нужно обрамлять вызов таких функций, но вот такие функции у меня вызываются в десятках классах в различных местах. Как тут быть? |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
ты все не правильно делаешь
ты создаешь кр. секцию во время каждого нового вызова ф-ии, а нужно, что-бы кр. секция жила столько-же сколько и общие данные, которые она защищает. То-есть сразу после создания объекта ты инициализируешь кр. секцию. Можно сделать ее членом класса объекта, который используется из разных потоков. А в ф-ии ты просто вызываешь EnterCriticalSection - LeaveCriticalSection |
|||
|
||||
| Андреy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 9.4.2008 Репутация: нет Всего: нет |
Спасибо за ответ. Кажется, я еще кое-что неправильно делаю (так ли это?). Зацепило слово "ОБЩИЕ". У меня то все данные разбиты по классам. Классы создаются при вызове COM-объекта, а в каждом потоке создается свой объект (apartment threading model). Меня смущало (и смущает) то, что остались глобальные функции, работающие с данными классов. Надо ли вообще мне заморачиваться с критическими секциями?
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
если у тебя 2 потока могут изменять один и тот-же объект одновременно, то да
зы я не силен в COM, но возможно тебе вообще ничего делать не нужно, COM все и так разрулит |
|||
|
||||
| kolobok0 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 24.12.2008 Репутация: нет Всего: 2 |
если мультитреад апартмен сервер (не дэлеле) - то да, может вызов приходить из разных процессов одновременно. если сингл - то нет на уровне кома выдаёться системное ожидание (посему долго не стоит "думать"). Вот с дэлеле сейчас не помню - возможно так же... удачи Вам (круглый) |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |