多线程下关于硬件资源的释放问题
2012-07-12 15:00
302 查看
大家都知道,多线程情况下释放硬件资源是件比较头大的事,因为各种硬件资源不像文本资源一样,能够很快的进行释放,这样我们在进行多线程编程时就有可能产生,一个子线程中调用了摄像头,但是在结束的时候,主线程已经结束了,而子线程还未结束,结果导致由于子线程无法退出使整个进程无法结束。
这里我介绍一种如何安全退出整个进程的方式,本文的介绍下windows下如何处理这种情况,但是只要你熟悉其他平台的api也可以很快的移植到ios,android,linux等平台。
1.原理,让主线程等待子线程安全退出,然后再退出,主线程退出时等待一个事件的到来,否则不退出,子线程在退出时产生一个内核事件告诉主线程子线程已经退出了,然后主线程再继续完成退出。
2.具体操作:首先先介绍两个windows编程常用的东西,waitforsingleobject和Event;第一个是等待一个信号或者事件等的发生,第二个是一个事件。如果你已经熟知这两个东西你可以跳过下面的废话,直接看第三点。
(1)CreateEvent(,,,)里面有4个参数第一个是一个安全级别的控制,这里我们利用默认的安全级别,所以传入NULL,第二个参数是是否为手动重置事件,这里我们选择TRUE,设置为自己去控制的事件,第三个参数是初始状态,我们设置为FALSE,代表这个事件没有发生,最后一个参数是事件名称,自己选个你喜欢的名字就好,当然有代表意义更好。这样事件的创建就完成了。函数返回一个句柄
(2)然后让我们来学习下事件发生的控制,SetEvent(XXXHandle);里面就一个句柄参数,说明哪个事件发生了。只要将其放在子线程结束return之前就好。
(3)接下来,介绍一个ReSetEvent这个函数参数和上面一个一样,将事件置为没有发生。这里放入主线程WaitForSingleObject之后就好。
(4)最后,说明下WaitForSingleObject(,)两个参数,第一个等待的事件等的句柄XXXHandle,第二个等待时间以毫秒为单位,我们选择INFINITE(0xFFFFFFFF)即无限的等下去直到发生为止。
3.然后,大致结构也就清楚了,在子线程开始的时候先将事件,置为没有发生,然后在结束之前置为发生就好,在主线程结束前,等待这个事件发生。经过以上3部就可以将硬件资源进行安全的释放掉。
这里我介绍一种如何安全退出整个进程的方式,本文的介绍下windows下如何处理这种情况,但是只要你熟悉其他平台的api也可以很快的移植到ios,android,linux等平台。
1.原理,让主线程等待子线程安全退出,然后再退出,主线程退出时等待一个事件的到来,否则不退出,子线程在退出时产生一个内核事件告诉主线程子线程已经退出了,然后主线程再继续完成退出。
2.具体操作:首先先介绍两个windows编程常用的东西,waitforsingleobject和Event;第一个是等待一个信号或者事件等的发生,第二个是一个事件。如果你已经熟知这两个东西你可以跳过下面的废话,直接看第三点。
(1)CreateEvent(,,,)里面有4个参数第一个是一个安全级别的控制,这里我们利用默认的安全级别,所以传入NULL,第二个参数是是否为手动重置事件,这里我们选择TRUE,设置为自己去控制的事件,第三个参数是初始状态,我们设置为FALSE,代表这个事件没有发生,最后一个参数是事件名称,自己选个你喜欢的名字就好,当然有代表意义更好。这样事件的创建就完成了。函数返回一个句柄
(2)然后让我们来学习下事件发生的控制,SetEvent(XXXHandle);里面就一个句柄参数,说明哪个事件发生了。只要将其放在子线程结束return之前就好。
(3)接下来,介绍一个ReSetEvent这个函数参数和上面一个一样,将事件置为没有发生。这里放入主线程WaitForSingleObject之后就好。
(4)最后,说明下WaitForSingleObject(,)两个参数,第一个等待的事件等的句柄XXXHandle,第二个等待时间以毫秒为单位,我们选择INFINITE(0xFFFFFFFF)即无限的等下去直到发生为止。
3.然后,大致结构也就清楚了,在子线程开始的时候先将事件,置为没有发生,然后在结束之前置为发生就好,在主线程结束前,等待这个事件发生。经过以上3部就可以将硬件资源进行安全的释放掉。
相关文章推荐
- 关于cocos2d-x 资源释放问题
- 一个关于多线程对象释放的问题
- 关于cocos2d-x 资源释放问题
- 关于MappedByteBuffer资源释放问题
- 从牛人那儿学习了关于using及数据库操作时注意释放资源的问题
- 关于HibernateDaoSupport getSession()不能释放资源的问题及解决方法
- 关于Dot.net资源释放问题.
- 关于HibernateDaoSupport getSession()不能释放资源的问题及解决方法
- 关于使用PyTorch设置多线程(threads)进行数据读取而导致GPU显存始终不释放的问题
- 关于MappedByteBuffer资源释放问题
- 关于GDI资源使用后未释放,导致GDI对象猛增,程序花屏,异常退出的问题
- 从牛人那儿学习了关于using及数据库操作时注意释放资源的问题
- 从牛人那儿学习了关于using及数据库操作时注意释放资源的问题
- 关于Cocos2d-x多线程异步载入资源的问题
- c#中的托管资源和非托管资源的释放问题
- 国务院关于做好省级以下国土资源管理体制改革有关问题的通知-国发(2004)12号
- wince 下CDC资源释放问题:DeleteDC
- 关于资源版本管理的问题
- 一个关于applet访问硬件的问题??
- 关于Android开发中图片资源文件夹drawable中图片与资源ID号出现对不上的问题