QMutex - защита внутри потока, но не между потоками

Мне нужно защитить ресурс от прерывания, в данном случае записи в сокет. У меня есть класс TelnetServer, экземпляр которого создается много раз (один раз для каждого используемого соединения).

Я хочу, чтобы запись для одного пользователя не прерывалась другой записью для того же пользователя (т.е. блокировка мьютекса для записи в этот сокет). Но я не хочу замораживать ВСЕ записи во все сокеты, пока я пишу одному пользователю. Чтобы уточнить (псевдо С++):

Class TelnetThread {
  QMutex mutex;

  void writeToSocket() {
      mutex.lock();
      socket->write(string);
      mutex.unlock();
  }
}

Поэтому, если у меня работает 30 TelnetThread, запись в один сокет НЕ должна препятствовать одновременной записи в другой поток. Но если пара слотов запускает запись в один и тот же сокет/поток, то их следует сериализовать.

Где я должен объявить переменную мьютекса? Если я сделаю это переменной класса (потока), не будет ли это сериализовать все записи сокетов во всех потоках (всех экземплярах этого класса)? Если я сделаю это функциональной переменной внутри writeToSocket, то я не думаю, что она будет сериализовать записи даже в один и тот же сокет.

Помогите... как мне это сделать?


person TSG    schedule 03.10.2013    source источник
comment
Вы должны объявить свой мьютекс в той же области, что и член сокета.   -  person Dmitry Sazonov    schedule 03.10.2013
comment
Если вам нужен один мьютекс на сокет, соедините его с каждым сокетом.   -  person Frank Osterfeld    schedule 03.10.2013
comment
Я не понимаю, как. Основываясь на моем чтении, если я объявлю переменную сокета на уровне класса и мьютекс на уровне класса, то все потоки (этого класса) будут использовать один и тот же мьютекс, а это не то, что мне нужно.   -  person TSG    schedule 03.10.2013


Ответы (1)


то есть блокировка мьютекса для записи в этот сокет

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

Как я писал в одном из ваших предыдущих тредов, я бы рассмотрел возможность использования QMutexLocker для таких случаев. Это менее подвержено ошибкам, а также делает код короче.

person lpapp    schedule 03.10.2013