Здравствуйте возник вопрос в синхронизации отдельной части приложения, вот пример:
class Server : public IServer
{
public:
typedef std::shared_ptr<boost::asio::ip::tcp::socket> SPtrClientSocket;
...
void startServer() override;
void stopServer() override;
private:
...
void addClient(const SPtrClientSocket& client);
void removeClient();
private:
...
std::mutex mtx;
std::queue<SPtrClientSocket> _clients;
};
void Server::addClient(const SPtrClientSocket& client)
{
std::lock_guard<std::mutex> lock(mtx);
_clients.push(client);
}
void Server::removeClient()
{
std::lock_guard<std::mutex> lock(mtx);
_clients.pop();
}
Как видно из примера, у меня есть сервер на который коннектятся клиенты. Один поток слушает соединение и добавляет клиентов в очередь, другой потом выполняет какие-либо действия с этим клиентом отправляет ему результат и удаляет из очереди. В связи с этим я немного сомневаюсь в правильности моей синхронизации не получится ли UD? Может кто-нибудь расскажет наиболее оптимальный вариант синхронизации для данного случая? Заранее спасибо...
Должен быть код ожидания событий (не предоставил) в котором при получении должен блокироваться mtx
. (condition_variable
, wait
, notify_one
) Сервер при посылании события должен лочить mtx
, и обработчик тоже. Mutex и queue и condition_variable должны быть доступны И серверу И обработчику.
Объясните, пожалуйста, как производится запись? Есть файл с такими строками:
Нужно создать функцию, добавление элементов в очередь, выводится ошибка:"Выражение должно быть допустимым для изменение левосторонним значением"...
При запуске файла возникает ошибка сегментирования (стек памяти сброшен на диск)Читал, что это может быть из-за того, что происходит утечка...