Синхронизация двух потоков

53
12 июля 2018, 01:10

Здравствуйте возник вопрос в синхронизации отдельной части приложения, вот пример:

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? Может кто-нибудь расскажет наиболее оптимальный вариант синхронизации для данного случая? Заранее спасибо...

Answer 1

Должен быть код ожидания событий (не предоставил) в котором при получении должен блокироваться mtx. (condition_variable, wait, notify_one) Сервер при посылании события должен лочить mtx, и обработчик тоже. Mutex и queue и condition_variable должны быть доступны И серверу И обработчику.

READ ALSO
Бинарная запись. С++

Бинарная запись. С++

Объясните, пожалуйста, как производится запись? Есть файл с такими строками:

27
Очередь(Добавление элементов)

Очередь(Добавление элементов)

Нужно создать функцию, добавление элементов в очередь, выводится ошибка:"Выражение должно быть допустимым для изменение левосторонним значением"...

46
Ошибка сегментирования (С++)

Ошибка сегментирования (С++)

При запуске файла возникает ошибка сегментирования (стек памяти сброшен на диск)Читал, что это может быть из-за того, что происходит утечка...

16