Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Критические секции с общей очередью


Автор: Agentx86 4.6.2009, 14:18
Суть задания такова. Есть очередь в которую может писать неограниченное колличество потоков. И есть двадцать потоков которые обрабатывают эту очередь. Синхронизацию нужно сделать при помощи критических секций. Думаю как лучше организовать очередь. Есть мысль сделать вектор. Потоки которые считыают данные просто читают первый элемент вектора. Потом удаляют его. Я так понимаю перед тем как читать данные поток входит в критическую секцию, читает первую строку, удаляет её и выходит из критической секции. У меня возникает вопрос по поводу использования вектора. Может ли использование вектора повлиять на скорость работы программы(в худшую сторону)? Какой способ рыботы с очередью окажется самым быстрым?

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

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

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

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

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

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

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

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

Автор: Alca 4.6.2009, 17:54
http://forum.sources.ru/index.php?showtopic=271380

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

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

Автор: Alca 4.6.2009, 20:56
Цитата

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

Автор: Agentx86 5.6.2009, 12:27
Чувствую прийдется согласиться(по поводу семафора). Всем спасибо за помощь. Избавлюсь от нескольких граблей при разработке приложения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)