最近写的camera图像采集程序是一个多线程程序,一个主线程创建了两个image grab线程。两个grab线程分别控制两组fps和resolution不同的camera,由于capture的桢率太高,120fps和30fps,所以无法实时存下image。因此我开辟了大量的内存,将capture的image先存到内存了,然后再不断的创建save image线程来存image,当一定内存区域的data存下来得时候,该save线程就把内存给free掉。
花了很多的时间才想到这个策略,实际上也是很有效的。然后写程序的时候,碰到了更多的问题。对于两个grab线程,我用了WaitForMulitipleThreads()来结束,而save线程,因为要考虑到实时性(save线程是在grab image的for循环里创建的,先grab一定数量的image, 然后创建save线程,然后再循环去grab),所以没有用WaitForSingleThread()来结束,直接创建了线程就不管了。这时候出现了很多问题,
1。我是在grab for循环里创建save线程的,也就是在for 循环里pack传给save线程的参数(内存指针,一些camera 参数,存image的路径等等),每次循环只更新部分参数。这样结果造成,参数在传给save线程之前是正确的,但是当save线程执行时,这些参数在save线程外得到了更新(因为thread函数传入的是一个void指针),在save线程里访问这些参数时,有可能被改变了,也有可能正在被刷新,这样造成了指针无法访问,char*出现了乱码。
解决方法,如果知道要创建的save线程数量,就开辟相应足够的空间来把这些传入参数统统存下来,每个save线程有各自独立的输入参数空间,这样就可以了。
2。grab线程只是grab image,然后new memory,创建save 线程就退出了。如果save线程的参数空间是new来创建的,这时候当grab线程结束,把save线程的参数空间给delete的时候,有些save线程还没有结束(磁盘操作是很花时间的),这样save线程就会报错了,参数丢失了。
解决方法,当每个save线程执行时,先把输入参数copy到该save线程自己的线程空间堆栈了,这时候如果输入参数空间被delete了,自己函数空间了也有备份,就一点问题都没有了。
就这些东西花了一个星期才搞兴趣,自己还是太笨了。