问题描述:
最近在以 OBS 源码为基础开发一款软件。发现代码在某处执行到 obs_source_release(srcCanvas) ---> obs_ref_release(&control->ref) 处时判断为假,以致obs_source_destroy(source) 不能正常执行,资源不能正常释放,导致新的同名资源添加不上。
解决思路:
转到函数最底层定义发现此函数 _InterlockedDecrement(val)
互动百科解释是该函数减小指定的变量,并检查值,可以保证同一时刻只有一个线程访问该变量,即保证增加操作的原子性。
http://www.baike.com/wiki/InterLockedDecrement
一开始不太明白这个解释。后来通过替换代码查找问题,最后发现问题是OBSSource资源srcCanvas被我写成了一个全局类的成员变量,所以srcCanvas一直在被占用,一直有线程访问变量。类没有释放,所以它一直不能释放掉。
解决办法:
首先,OBSSource资源srcCanvas不能作为全局类的成员变量,需要通过其他方法实现功能。
其次,OBSSource srcCanvas = obs_get_source_by_name(name_t); 之后必须使用 obs_source_release(srcCanvas); 释放资源。