2013-08-09 4 views
1

У меня есть функция обратного вызова, которая будет вызвана в потоке, к которому у меня нет доступа или управления (библиотека, созданная этим потоком, и требует, чтобы я подвергал функцию обратного вызова этому нить). Поскольку разъем zmq не поточно, вот что я делаю:Использование zmq socket в функции обратного вызова

void callback() { 
    zmq::socket_t tmp_sock(...); // create a socket which will be used only once 
    ... 
} 

Однако обратный вызов в настоящее время вызываются очень часто (сотни раз в секунду). Есть ли лучшее решение для более эффективного использования сокета? Я спросил об этом, потому что Руководство говорит: Если вы открываете и закрываете множество сокетов, это, вероятно, признак того, что вам нужно перепроектировать ваше приложение.

Редактировать: Основано на ответе @ raffian. A thread_local static (доступно в C++ 11) переменная в функции обратного вызова работает нормально.

+0

У меня есть аналогичная проблема. Я планирую использовать локальное хранилище потоков для управления сокетом. Но я не знаю, будет ли это работать. – tdelaney

ответ

1

я задал тот же вопрос, но в Java:

Принципы те же: предварительно инициализировать пул рабочих потоков, каждый со специальным гнездом, готовый к использованию для чтения/записи. В примере Java я использую ThreadLocal; Я полагаю, что в C++ вы можете использовать #include <boost/thread/tss.hpp>. Этот подход согласуется с руководством ZeroMq; используйте розетки только в потоках, которые их создали.

Я не ++ программист C, но если вы используете этот подход, вы должны сделать что-то вроде этого:

void callback() { 
    workerPool.doTask(new Task(args here)); 
    ... 
} 

Создать Task, с аргументами, и отправить его в workerPool, где он назначен потоку с выделенным сокетом. Вы хотите создать рабочий пул с достаточным количеством потоков для размещения нагрузки, тем не менее, параллелизм не должен вызывать беспокойства.

+0

Благодарим вас за упоминание 'tss.hpp'. Это звучит многообещающе, я постараюсь поместить его в свою программу. +1 – GuLearn

+0

Вот [сообщение] (http://stackoverflow.com/a/6021676/642070) о том, как динамически инициализировать локальное хранилище потоков в boost. – tdelaney

+0

@tdelaney Спасибо за предоставленную ссылку. Ключевое слово 'thread_local' в C++ 11 также работает – GuLearn

Смежные вопросы