Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 用C++;11创建额外的线程_Multithreading_Opencv_C++11_Gdb - Fatal编程技术网

Multithreading 用C++;11创建额外的线程

Multithreading 用C++;11创建额外的线程,multithreading,opencv,c++11,gdb,Multithreading,Opencv,C++11,Gdb,我正在调试一个用C++11编译的OpenCV应用程序(我使用OpenCV 2.4.10)。该应用程序有两个线程在CPU上执行一些图像处理(没有使用GPU函数,但我在链接库中还包括了libopencv\u GPU.so) 使用gdb我注意到,我发现运行的不是两个线程(主进程线程和由主进程线程创建的另一个线程),而是3个线程: (gdb) info threads Id Target Id Frame 78 Thread 0x7fffe2ff5700 (LWP 20531

我正在调试一个用C++11编译的OpenCV应用程序(我使用OpenCV 2.4.10)。该应用程序有两个线程在CPU上执行一些图像处理(没有使用GPU函数,但我在链接库中还包括了
libopencv\u GPU.so

使用gdb我注意到,我发现运行的不是两个线程(主进程线程和由主进程线程创建的另一个线程),而是3个线程:

(gdb) info threads 
Id   Target Id         Frame 
78   Thread 0x7fffe2ff5700 (LWP 20531) "app_name" 0x00007ffff5bb2f3d in nanosleep () at ../sysdeps/unix/syscall-template.S:81
2    Thread 0x7fffe3c42700 (LWP 20454) "app_name" 0x00007ffff5bdf12d in poll () at ../sysdeps/unix/syscall-template.S:81
* 1    Thread 0x7ffff7fab800 (LWP 20450) "app_name" 0x00007ffff5bb2f3d in nanosleep () at ../sysdeps/unix/syscall-template.S:81
线程1和78(使用gdb ID)正在执行我的代码。我在每个线程中都添加了一个睡眠调用,这样我就可以确保这些线程是我的线程。 线程2(使用gdb ID)是在进入主进程的主函数之前创建的。就我所能调试的而言,ID为2的线程一直只调用poll()函数

我是gdb的新手,也许你可以告诉我如何找出谁创建了这个线程,以及它的用途是什么?这与OpenCV相关还是与C++11相关?当我使用Opencv4Tegra编译同一个应用程序并在Tegra K1板上运行它时,线程2不存在

编辑 这是创建线程2时的回溯。似乎是libusb造成了这种情况,但我不知道为什么:

(gdb) backtrace
#0  __pthread_create_2_1 (newthread=0x7fffea79c438, attr=0x0, start_routine=0x7fffea5941c0, arg=0x0) at pthread_create.c:466
#1  0x00007fffea5943df in ?? () from /lib/x86_64-linux-gnu/libusb-1.0.so.0
#2  0x00007fffea5926a5 in ?? () from /lib/x86_64-linux-gnu/libusb-1.0.so.0
#3  0x00007fffea58b715 in libusb_init () from /lib/x86_64-linux-gnu/libusb-1.0.so.0
#4  0x00007ffff2f06a0e in ?? () from /usr/lib/x86_64-linux-gnu/libdc1394.so.22
#5  0x00007ffff2ef5465 in dc1394_new () from /usr/lib/x86_64-linux-gnu/libdc1394.so.22
#6  0x00007ffff6f615e9 in CvDC1394::CvDC1394() () from /usr/local/lib/libopencv_highgui.so.2.4
#7  0x00007ffff6f373f0 in _GLOBAL__sub_I_cap_dc1394_v2.cpp () from /usr/local/lib/libopencv_highgui.so.2.4
#8  0x00007ffff7dea13a in call_init (l=<optimized out>, argc=argc@entry=3, argv=argv@entry=0x7fffffffdcd8, env=env@entry=0x7fffffffdcf8) at dl-init.c:78
#9  0x00007ffff7dea223 in call_init (env=<optimized out>, argv=<optimized out>, argc=<optimized out>, l=<optimized out>) at dl-init.c:36
#10 _dl_init (main_map=0x7ffff7ffe1c8, argc=3, argv=0x7fffffffdcd8, env=0x7fffffffdcf8) at dl-init.c:126
#11 0x00007ffff7ddb30a in _dl_start_user () from /lib64/ld-linux-x86-64.so.2

(gdb) quit
(gdb)回溯
#在pthread\u create.c:466处创建0个线程(newthread=0x7fffea79c438,attr=0x0,start\u例程=0x7fffea5941c0,arg=0x0)
#1 0x00007fffea5943df英寸??()来自/lib/x86_64-linux-gnu/libusb-1.0.so.0
#2 0x00007fffea5926a5英寸??()来自/lib/x86_64-linux-gnu/libusb-1.0.so.0
#3/lib/x86_64-linux-gnu/libusb-1.0.so.0中libusb_init()中的0x00007fffea58b715
#4 0x00007FF2F06A0E英寸??()来自/usr/lib/x86_64-linux-gnu/libdc1394.so.22
#来自/usr/lib/x86_64-linux-gnu/libdc1394.so.22的dc1394_new()中的5 0x00007FF2EF5465
#6/usr/local/lib/libopencv_highgui.so.2.4中的CvDC1394::CvDC1394()中的0x00007FF6F615E9
#7 0x00007FF6F373F0,位于/usr/local/lib/libopencv\u highgui.so.2.4中的\u GLOBAL\u sub\u cap\u dc1394\u v2.cpp()中
#调用_init(l=,argc)中的8 0x00007FF7DEA13A=argc@entry=3,argv=argv@entry=0x7FFFFFDCD8,环境=env@entry=0x7FFFFFDCF8)在dl init.c:78处
#9 0x00007FF7DEA223在dl init.c处的调用_init(env=,argv=,argc=,l=)中:36
#10 _dl_init(main_map=0x7ffff7ffe1c8,argc=3,argv=0x7fffffffdcd8,env=0x7fffffffdcf8)在dl init.c:126处
#11 0x00007ffff7ddb30a位于/lib64/ld-linux-x86-64.so.2中的_dl_start_user()中
(gdb)退出

能否检查线程2的调用堆栈?这可能会产生更多信息,例如顶级线程函数。
highgui->libdc1394
这就是Firewire摄像头。您是从cam(
cv::VideoCapture
)捕获图像吗?奇怪的是,对libusb的调用似乎libdc1394也可以支持一些USB摄像头。粗略猜测,你在一台装有内置摄像头的笔记本电脑上运行这个程序,因此线程被创建,而你的Tegra板上没有连接任何线程。我想你们是对的。。。刚刚在代码中找到对highgui的调用。谢谢