多线程共用同一指针问题
//创建视频处理dll指针m_pProcessDll=newCImageProcessDll(dll_name);然后创建两个线程,两个线程都调用m_pProcessDl...
// 创建视频处理dll指针 m_pProcessDll = new CImageProcessDll(dll_name);
然后创建两个线程,两个线程都调用m_pProcessDll,同样的操作,运行处理大部分都是成功的,少数情况会出错。
现在想问问,是不是不能共用同一指针,或者要用什么智能指针 展开
然后创建两个线程,两个线程都调用m_pProcessDll,同样的操作,运行处理大部分都是成功的,少数情况会出错。
现在想问问,是不是不能共用同一指针,或者要用什么智能指针 展开
展开全部
可以共用同一指针。但必须要有互斥,即临界值。
这样,当一个线程写入时,另一线程可以等待。否则会出现内存不能访问或数据错误的情况。
智能指针也是同一指针,只是在调用时,智能封装了指针,当一个线程调用资源时,一个计数变量会自动+1,当Release时,会-1,当为0时,会清除此指针对象。这样就可避免一个线程清除了对象,而另一线程还在调用此对象,引发错误的情况。
当然,如果同一对象,不在不同线程中释放,可以不用智能指针。
这样,当一个线程写入时,另一线程可以等待。否则会出现内存不能访问或数据错误的情况。
智能指针也是同一指针,只是在调用时,智能封装了指针,当一个线程调用资源时,一个计数变量会自动+1,当Release时,会-1,当为0时,会清除此指针对象。这样就可避免一个线程清除了对象,而另一线程还在调用此对象,引发错误的情况。
当然,如果同一对象,不在不同线程中释放,可以不用智能指针。
追问
我是新建指针,调用两个线程,再删除指针。线程里面没写删除指针的话。所以应该没有你说的这种错误:避免一个线程清除了对象,而另一线程还在调用此对象,引发错误的情况。
大部分情况都是运行正确的,10次可能错一次。
点“视频增强”按钮,选择参数,如果出现进度条了,就成功了,就一路处理下去。出错都是点“视频增强”按钮,没出现进度条,出错。
展开全部
追问
两个线程功能一样的,所以我就写了同一个线程,然后传参数进去。线程数目是根据电脑cpu核数来的。另外如果把创建指针的话写在线程里面,会有点奇怪。正确的操作步骤是点“视频增强”按钮,然后弹出一个对话框,选择参数,然后再处理。如果把创建指针的话写在线程里面,就会弹出两个对话框,有点奇怪。
追答
看你向其他人追问的情况,绝大可能就是没有设置(使用)临界区导致的。你具体了解下临界区的知识,加上去估计就没有问题了。
我的多线程程序中,不加临界区,就经常发生这种偶尔出错的情况,加上就OK了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
多线程编程是得需要增加锁来保护的,增加锁来保护你这个指针是必须的,我记得我在做视频移动侦测时,开了多线程都得保护
用pthread_mutex_lock()和 pthread_mutex_unlock()来可以
用pthread_mutex_lock()和 pthread_mutex_unlock()来可以
追问
线程里面把指针复制一下,会不会就避免问题了
追答
线程里复制没什么效果,因为线程里你此时已经操作了这个指针,要是在线程外就复制一份那倒还可以的,关键看你这个指针用来做什么的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
增加访问的时候的互斥的控制,或者稍微做一点复杂的实现,readonly mode不互斥,需要write/update的时候实现互斥访问
追问
是不是要用什么深拷贝浅拷贝。 大部分情况都是运行正确的,10次可能错一次
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询