Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Путин
42 / 22 / 13
Регистрация: 14.04.2011
Сообщений: 578
#1

Как заставить поток ждать в некоторых ситуациях - C++

21.02.2015, 19:18. Просмотров 399. Ответов 2
Метки нет (Все метки)

Есть такой сценарий приложения:

Приложение до запуска TCP кеширует данные из MySQL в std::vector, далее запускается TCP и ожидаются подключения.

Клиент подключается к серверу и сразу же шлет привет, сервер ищет этот привет в std::vector, который ранее был заполнен данными из MySQL и в зависимости от того что там есть посылает ответ клиенту.

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

Тут пошли вопросы...

Как только я рассказываю серверу что данные в векторе is invalid, сервер удаляет все из вектора и начинает кешировать данные из бд снова, но это может занять некоторое время и если в это время кто-то постучался на сокет, то к этому моменту "привета" (который нужно найти в векторе) в векторе может не оказаться, если привета в векторе нет, сервер говорит клиенту что он не клиент и закрывает соединение.

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

- Что можно придумать чтобы заставить поток ждать перед обращением к вектору?
Была сначала идея воспользоватся mutex'oм, но так и не могу придумать куда его поставить.
Есть еще идея сделать отдельную bool переменную, которая будет хранить текущее поведение кеша.
http://www.cyberforum.ru/cpp-beginners/thread329789.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2015, 19:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как заставить поток ждать в некоторых ситуациях (C++):

Как заставить машину ждать перед очередным выполнением цикла?
есть код#include <stdio.h> #include <iostream> #include <conio.h> using...

В каких ситуациях можно НЕ проверять предусловие?
В каких ситуациях можно НЕ проверять предусловие?

Почему в некоторых случаях используется массив для хранения стека, а в некоторых нет?
Почему в некоторых случаях используется массив для хранения стека ,а в...

Как заставить один поток ждать, пока работает другой
Здравствуйте, стоит такая задача: есть public static bool forks = new...

Как заставить поток ждать, пока не будет выполнено определенное действие?
Добрый день. Решил написать небольшую игру в VB .NET Первая версия оказалась...

2
DrOffset
7517 / 4513 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
21.02.2015, 21:48 #2
Лучший ответ Сообщение было отмечено Путин как решение

Решение

Цитата Сообщение от Путин Посмотреть сообщение
Была сначала идея воспользоватся mutex'oм, но так и не могу придумать куда его поставить.
Если ты к этом вектору получаешь доступ из разных потоков, то mutex нужен в любом случае.
В потоке кеширования:
1) залочил мютекс
2) заполнил вектор
3) разлочил мютекс
В потоке, который читает из вектора
1) залочил мютекс (тот же самый)
2) поискал в векторе
3) разлочил мютекс

Ожидание заполнения получишь тут естественным путем.
0
Nosey
1349 / 400 / 144
Регистрация: 22.10.2014
Сообщений: 863
Завершенные тесты: 2
21.02.2015, 22:20 #3
Путин,
Мануал1, мануал2 и в результате shared_mutex.h, shared_mutex.cpp либо boost::shared_mutex.
А также наверное стоит подумать о том правильно ли так кешировать "приветы", если там данных на самом деле много, то поиск в базе будет выполняться поди быстрее нежели в векторе - раз.
Два - если данных мало и записи в базу будут происходить часто, то цена этому кешированию ровным счётом нулевая -> может расширить "кеширование" и реплицировать изменения в базу реже, если конечно это возможно.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2015, 22:20
Привет! Вот еще темы с решениями:

QtConcurrent - заставить главный поток ждать своих детей
Вобщем не успел я разобраться QtConcurrent::run, и тут новая беда :) допустим...

Как заставить цикл ждать ?
Есть массив времён которые обрабатываются в цикле. В теле цикла запускается...

Семафоры (как заставить клиента ждать?)
1 программа (сервер): создаем разделяемую память и записываем 12345.6789 2...

Как заставить браузер не ждать ответа?
Суть такова... Принимаю POST, а теперь браузер надо послать на три веселые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru