Мне удалось решить эту проблему. В Java уже было реализовано решение. Я использовал ту же идею и реализовал ее в C ++.
Первое, что я сделал, я создал TProcessorFactory вместо класса TTransport. Это обрабатывает TProcessors для каждого соединения. В нем есть структура карты, поэтому ее функция get возвращает соответствующий TProcessor для каждого TTransport. Соответствующий (уникальный) TProcessor для каждого клиента.
Мне пришлось создать новый TServer, чтобы он принимал вновь созданный параметр TProcessorFactory вместо TProcessor. В TServer также необходимо изменить пару вызовов функций. Ваша функция getProcessor больше не будет возвращать TProcessor, а TProcessorFactory (поэтому измените тип возвращаемого значения и переименуйте).
Последнее, что вам нужно сделать, - это реализовать сервер, который позволяет создавать экземпляры, производный класс TServer. Я предлагаю использовать TNonblockingServer (немного сложнее реализовать изменение) или TThreadPoolServer. Вы должны изменить пару вызовов функций. Используйте функцию get в TProcessorFactory с параметром TTransport, чтобы получить TProcessor, где это необходимо. Параметр TTransport уникален для каждого потока, каждое клиентское соединение обрабатывается одним потоком.
Также убедитесь, что вы удалили старые TP-процессоры, потому что они повторно используют (по крайней мере, с TNonblockingServer) TTransport, поэтому, если вы не удалите их и клиент подключится, он, вероятно, получит неактивный предыдущий сеанс, и вы, вероятно, не не хочу этого Если вы используете общие указатели, просто удалите их из структуры карты, когда клиент отключится, и если они больше не нужны для экономии, они будут уничтожены.
Надеюсь, это поможет любому, кто столкнулся с той же проблемой, что и я. Если вы не знаете внутреннюю структуру комиссионных, вот хороший гид: http://diwakergupta.github.com/thrift-missing-guide/
Я надеюсь, что разработчики Thrift собираются реализовать нечто подобное, но более сложное и абстрактное решение в ближайшем будущем.
@