您的位置:首页 > 运维架构 > Linux

多线程下关于硬件资源的释放问题

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部就可以将硬件资源进行安全的释放掉。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息