VideoDecoder打开文件
FILE *fp;
fp = fopen(path, "rb");
void VideoDecoder::release() {
if (fp) {
fclose(fp);
}
}
MediaSource打开文件
FILE *file;
file = fopen(file_str, mode);
同一个线程有两个对象分别打开两个文件,第一个对象VideoDecoder打开fd是94, 用完后通过release函数调用fclose关闭, 但是这个释放完成后没有对fp没有赋值为NULL.
这时候对象二MediaSource同样的方式打开文件, 分配的fd也刚好是94, 对象二需要进行seek, read等操作时候, VideoDecoder的release又被调用一次, 这时候悲剧发生了, VideoDecoder中的fp虽然被close了,但是还是通过release里面close把fd为94的文件给关闭了, 这个fd是ediaSource里面刚刚打开的, 所以就seek, read操作都失败, 用fileno(file)得到的MediaSource中的fd也变成了-1.
所以最后解决办法就超简单, fp赋值为NULL即可.
void VideoDecoder::release() {
if (fp) {
fclose(fp);
fp = NULL;
}
}
文件打开关闭必须配对, 这个问题中, 同一线程打开了两个文件,前一个被释放的时候,后一个打开的fd刚好用了前一个fd.