Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Критические секции с общей очередью |
Автор: Agentx86 4.6.2009, 14:18 |
Суть задания такова. Есть очередь в которую может писать неограниченное колличество потоков. И есть двадцать потоков которые обрабатывают эту очередь. Синхронизацию нужно сделать при помощи критических секций. Думаю как лучше организовать очередь. Есть мысль сделать вектор. Потоки которые считыают данные просто читают первый элемент вектора. Потом удаляют его. Я так понимаю перед тем как читать данные поток входит в критическую секцию, читает первую строку, удаляет её и выходит из критической секции. У меня возникает вопрос по поводу использования вектора. Может ли использование вектора повлиять на скорость работы программы(в худшую сторону)? Какой способ рыботы с очередью окажется самым быстрым? |
Автор: xvr 4.6.2009, 15:26 |
Вам нужен не std::vector а std::deque Еще вам нужен семафор для синхронизации потоков чтения и записи, что бы потоки чтения не висели в цикле на очереди, ожидая что в нее упадут данные |
Автор: GremlinProg 4.6.2009, 15:28 |
работать конечно на списках будет быстрее, т.к. тут потребуются вставки и удаления элементов на концах очереди, да и произвольный доступ к ее элементам не нужен |
Автор: Agentx86 4.6.2009, 15:37 | ||
Большое спасибо за то что объснили по поводу очередей. Семафор мне не нужен. Просто здесь я описал часть задания. И может показаться, чтото не так. В реальности это клиент-серверное приложение. Когда приходит от клиента сообщение. Создается новый поток. Делается вход в критическую секцию. Добавляется в очередь строка. Выход из критической секции. Завершение этого потока. т.е. каждое присланное сообщение от клиента это отдельный поток. А чтение сервером очереди можно делать только тогда, когда длина очереди больше нуля. |
Автор: Alca 4.6.2009, 17:54 |
http://forum.sources.ru/index.php?showtopic=271380 |
Автор: xvr 4.6.2009, 18:16 | ||
А как сервер узнает, что длинна очереди больше нуля? Он будет ее постоянно сканировать? Вот для того, что бы постоянно не сканировать и нужен семафор. |
Автор: Alca 4.6.2009, 20:56 | ||
![]() |
Автор: Agentx86 5.6.2009, 12:27 |
Чувствую прийдется согласиться(по поводу семафора). Всем спасибо за помощь. Избавлюсь от нескольких граблей при разработке приложения. |