Я пытаюсь использовать многопоточность в boost для обработки нескольких запросов, и после получения определенного сообщения я создам новый поток для его обработки, как показано ниже:
main.cpp
/ ** * Обработчик запроса назначения машины. * * @param msg Полученное сообщение. * @param ec Код ошибки. * / void handover_request_handler (odtone :: mih :: message &msg, const boost :: system :: error_code &ек) { если (ес) { log_ (0, ФУНКЦИЯ, "ошибка:", ec.message ()); вернуть; } // Делаем что-нибудь }
void event_handler (odtone :: mih :: message &msg, const boost :: system :: error_code &ек) { если (ес) { log_ (0, ФУНКЦИЯ, "ошибка:", ec.message ()); вернуть; }
switch (msg.mid()) { // Destination Cloud Server received HO Commit Message case odtone::mih::indication::n2n_ho_commit: { boost::thread thrd(boost::bind(&handover_request_handler, msg, ec)); thrd.join(); } break; }
}
Когда я пытаюсь скомпилировать его с помощью инструмента b2, я получаю следующие ошибки:
gcc.compile.c ++ ../../bin.v2/app/lte_mih_usr/gcc-4.6/debug/link-static/runtime-link-static/main.o
main.cpp: в функции void event_handler (odtone :: mih :: message&, const boost :: system :: error_code&)»:
main.cpp: 189: 69: ошибка: использование удаленной функции ‘odtone :: mih :: message :: message (const odtone :: mih :: message)&)»
В файл включен из ../../inc/odtone/mih/request.hpp:24:0,
из main.cpp: 11:
Так как решить эту проблему?
Большое спасибо.
thread
конструктор копирует свои аргументы, а message
тип не копируется. Чтобы передать ссылку на целевую функцию, вам нужно использовать boost::ref(msg)
Также обратите внимание, что с помощью bind
с thread
не нужно:
boost::thread thrd(&handover_request_handler, boost::ref(msg), boost::ref(ec));
thread
конструктор реализует ту же семантику, что и bind
так что используя bind
просто добавляет ненужное дополнительное копирование.
Других решений пока нет …