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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Критические секции с общей очередью 
V
    Опции темы
Agentx86
Дата 4.6.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Суть задания такова. Есть очередь в которую может писать неограниченное колличество потоков. И есть двадцать потоков которые обрабатывают эту очередь. Синхронизацию нужно сделать при помощи критических секций. Думаю как лучше организовать очередь. Есть мысль сделать вектор. Потоки которые считыают данные просто читают первый элемент вектора. Потом удаляют его. Я так понимаю перед тем как читать данные поток входит в критическую секцию, читает первую строку, удаляет её и выходит из критической секции. У меня возникает вопрос по поводу использования вектора. Может ли использование вектора повлиять на скорость работы программы(в худшую сторону)? Какой способ рыботы с очередью окажется самым быстрым?
PM MAIL   Вверх
asd
Дата 4.6.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Agentx86 @  4.6.2009,  14:18 Найти цитируемый пост)
Есть очередь в которую может писать неограниченное колличество потоков

Это задание в институте? Тогда вам нужна _очередь_ а не вектор, если понимать буквально. 

С критическими секциями всё просто. перед тем как что-то делать с очередью надо вызвать EnterCriticalSection, и потом не забыть сделать LeaveCriticalSection. Так же перед использованием критической секции в первый раз следует вызвать InitializeCriticalSection, иначе получите исключение при вызове EnterCriticalSection.


Это сообщение отредактировал(а) asd - 4.6.2009, 15:05
PM MAIL   Вверх
xvr
Дата 4.6.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Вам нужен не std::vector а std::deque
Еще вам нужен семафор для синхронизации потоков чтения и записи, что бы потоки чтения не висели в цикле на очереди, ожидая что в нее упадут данные

PM MAIL   Вверх
GremlinProg
Дата 4.6.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Agentx86 @  4.6.2009,  16:18 Найти цитируемый пост)
Какой способ рыботы с очередью окажется самым быстрым?

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Agentx86
Дата 4.6.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(xvr @  4.6.2009,  15:26 Найти цитируемый пост)
Вам нужен не std::vector а std::deque
Еще вам нужен семафор для синхронизации потоков чтения и записи, что бы потоки чтения не висели в цикле на очереди, ожидая что в нее упадут данные

Большое спасибо за то что  объснили по поводу очередей. Семафор мне не нужен. Просто здесь я описал часть задания. И может показаться, чтото не так. В реальности это клиент-серверное приложение. Когда приходит от клиента сообщение. Создается новый поток. Делается вход в критическую секцию. Добавляется в очередь строка. Выход из критической секции. Завершение этого потока. т.е. каждое присланное сообщение от клиента это отдельный поток. А чтение сервером очереди можно делать только тогда, когда длина очереди больше нуля.

Это сообщение отредактировал(а) Agentx86 - 4.6.2009, 15:38
PM MAIL   Вверх
Alca
Дата 4.6.2009, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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





--------------------
PM WWW ICQ Skype Jabber   Вверх
xvr
Дата 4.6.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Agentx86 @ 4.6.2009,  15:37)
А чтение сервером очереди можно делать только тогда, когда длина очереди больше нуля.

А как сервер узнает, что длинна очереди больше нуля? Он будет ее постоянно сканировать? Вот для того, что бы постоянно не сканировать и нужен семафор.

PM MAIL   Вверх
Alca
Дата 4.6.2009, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

нужен семафор.
 smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
Agentx86
Дата 5.6.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Чувствую прийдется согласиться(по поводу семафора). Всем спасибо за помощь. Избавлюсь от нескольких граблей при разработке приложения.
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.

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


 




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


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

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