Мне нужно передать через (Boost) TCP-сервер информацию, собранную в режиме реального времени библиотекой отслеживания видео ARToolKit.
Как правильно это сделать?
Я на самом деле делаю это с потоками Boost и asio, но я думаю, что то, что я делаю, сделано плохо (даже если это работает)
Вот что я делаю для запуска сервера (источник класса Server взят из учебника Boost):
boost::asio::io_service io_service;
Server s(io_service, 2345);
boost::thread bt(boost::bind(&boost::asio::io_service::run, &io_service)); //server in background in a second thread
Затем я запускаю отслеживание видео
startTracking(); //blocking call in the main thread
определяется таким образом
void startTracking(){
glutInit(&argc, argv); //global and reachable
if ((gArglSettings = arglSetupForCurrentContext()) == NULL) {
fprintf(stderr, "main(): arglSetupForCurrentContext() returned error.\n");
exit(-1);}
... //init a lot of artoolkit parameters
arVideoCapStart();
argMainLoop( NULL, keyEvent, mainLoop );
}
Таким (ужасным) образом все работает. Но я хотел бы избежать порождения второго потока для asio-сервера (он не должен туда бросаться, как я читал из документа Boost).
В противном случае попытка вывести отслеживание видео из основного потока приведет к сбою библиотеки ARToolKit, т.е.:
boost::thread workerThread(startTracking);
workerThread.join();
Когда join()
запускается, программа segfaults при вызове glutInit
startTracking()
? Является ли он потокобезопасным? - person Chad   schedule 10.02.2013