多线程共用同一指针问题

//创建视频处理dll指针m_pProcessDll=newCImageProcessDll(dll_name);然后创建两个线程,两个线程都调用m_pProcessDl... // 创建视频处理dll指针 m_pProcessDll = new CImageProcessDll(dll_name);
然后创建两个线程,两个线程都调用m_pProcessDll,同样的操作,运行处理大部分都是成功的,少数情况会出错。
现在想问问,是不是不能共用同一指针,或者要用什么智能指针
展开
 我来答
acode
2013-04-25 · 超过52用户采纳过TA的回答
知道小有建树答主
回答量:183
采纳率:100%
帮助的人:64.3万
展开全部
可以共用同一指针。但必须要有互斥,即临界值。
这样,当一个线程写入时,另一线程可以等待。否则会出现内存不能访问或数据错误的情况。
智能指针也是同一指针,只是在调用时,智能封装了指针,当一个线程调用资源时,一个计数变量会自动+1,当Release时,会-1,当为0时,会清除此指针对象。这样就可避免一个线程清除了对象,而另一线程还在调用此对象,引发错误的情况。
当然,如果同一对象,不在不同线程中释放,可以不用智能指针。
追问
我是新建指针,调用两个线程,再删除指针。线程里面没写删除指针的话。所以应该没有你说的这种错误:避免一个线程清除了对象,而另一线程还在调用此对象,引发错误的情况。
大部分情况都是运行正确的,10次可能错一次。
点“视频增强”按钮,选择参数,如果出现进度条了,就成功了,就一路处理下去。出错都是点“视频增强”按钮,没出现进度条,出错。
nvkle3
2013-04-25
知道答主
回答量:8
采纳率:0%
帮助的人:3.6万
展开全部
多线程访问同一个资源的时候,如果任意一个访问过程中有写操作,并且此资源需要使用多个指令来读写(汇编指令),就必须使用临界区
类型:CRITICAL_SECTION
函数:
EnterCriticalSection
LeaveCriticalSection

InitializeCriticalSection
DeleteCriticalSection

两组函数成对出现
-----------------------------

为何要用临界区?
简单的说法,一个线程在修改一组数据的时候,修改到一半,另一个线程就来访问这组数据,那么得到的结果就是错误的结果,就有可能导致程序出错
追问
两个线程功能一样的,所以我就写了同一个线程,然后传参数进去。线程数目是根据电脑cpu核数来的。另外如果把创建指针的话写在线程里面,会有点奇怪。正确的操作步骤是点“视频增强”按钮,然后弹出一个对话框,选择参数,然后再处理。如果把创建指针的话写在线程里面,就会弹出两个对话框,有点奇怪。
追答
看你向其他人追问的情况,绝大可能就是没有设置(使用)临界区导致的。你具体了解下临界区的知识,加上去估计就没有问题了。

我的多线程程序中,不加临界区,就经常发生这种偶尔出错的情况,加上就OK了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhaoleiaajlm
2013-04-25 · TA获得超过113个赞
知道答主
回答量:36
采纳率:0%
帮助的人:22.8万
展开全部
多线程编程是得需要增加锁来保护的,增加锁来保护你这个指针是必须的,我记得我在做视频移动侦测时,开了多线程都得保护
用pthread_mutex_lock()和 pthread_mutex_unlock()来可以
追问
线程里面把指针复制一下,会不会就避免问题了
追答
线程里复制没什么效果,因为线程里你此时已经操作了这个指针,要是在线程外就复制一份那倒还可以的,关键看你这个指针用来做什么的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
FanyongYin
2013-04-25 · TA获得超过1054个赞
知道小有建树答主
回答量:1298
采纳率:100%
帮助的人:1016万
展开全部
增加访问的时候的互斥的控制,或者稍微做一点复杂的实现,readonly mode不互斥,需要write/update的时候实现互斥访问
追问
是不是要用什么深拷贝浅拷贝。   大部分情况都是运行正确的,10次可能错一次
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式