- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在写一个基于 FFmpeg 的媒体播放器我有一个设计问题。我的代码调用一个函数,使用 SDL 的 SDL_AddTimer 以不规则的间隔渲染视频帧。功能。我的问题是,如果我想在一个视频结束(或播放停止)而另一个视频开始时执行垃圾收集,我如何确保队列中或执行过程中没有更多计时器以避免访问突然释放的对象。
最佳答案
有很多不同的方法可以根据您的具体实现来解决您的问题。一些基本的想法可以是:
定义一个 bool 值,指定玩家是否正在运行(true = running,false = not)
在每次与播放器相关的调用之前,检查该变量,如果它为 false(播放器已停止),则关闭该函数(立即返回)
然后,您调用 removeTimer
并将变量设置为 false 以关闭播放器。
但是,因为 addTimer
是一个创建线程的函数,有时会出现竞争条件(您称之为“执行中间”)。这是使用线程时的主要问题之一。
您需要使用诸如互斥体、信号量等工具来查找和修复这些问题……这些工具的选择在很大程度上取决于您要实现的避免这些竞争条件的策略。
因此,没有通用的解决方案。如果性能不是问题,您可以使用简单的“单锁”解决方案。这是“关键部分”策略的基本实现。它可以防止某些代码片段(关闭播放器和运行关键的声音相关调用)同时运行。
#include <pthread.h>
#include <stdbool.h>
pthread_mutex_t mutex;
bool isRunning;
int timerID;
void timerCallback(){
// do some computations
pthread_mutex_lock(&mutex);
// that critical section, defined here will never
// (thank to the mutex) occur at the same time at
// the critical section in the close method
if(isRunning){
// do critical calls
}
else{
// do nothing
}
pthread_mutex_unlock(&mutex);
// do some other computations
}
void init(){
pthread_mutex_init(&mutex, NULL);
isRunning = true;
startTimers();
}
void close(){
pthread_mutex_lock(&mutex);
// that critical section, defined here will never
// (thank to the mutex) occur at the same time at
// the critical section in the timerCallback method
SDL_RemoveTimer(timerID);
isRunning = false;
pthread_mutex_unlock(&mutex);
pthread_mutex_destroy(&mutex);
}
当然,我无法在一个简单的 stackoverflow 帖子中解释所有的竞争条件避免策略。 如果您需要提高性能,您应该准确定义代码的并发问题并选择正确的策略。
关于c - SDL_AddTimer 和线程,清除定时器队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37553680/
我最近开始使用 SDL,但遇到了一个问题 每次我执行 SDL_Addtimer 时,它的工作都非常不一致或根本不工作 到目前为止,我让它工作的唯一一次是将它置于无限循环中并希望它不会崩溃。 enter
我正在写一个基于 FFmpeg 的媒体播放器我有一个设计问题。我的代码调用一个函数,使用 SDL 的 SDL_AddTimer 以不规则的间隔渲染视频帧。功能。我的问题是,如果我想在一个视频结束(或播
我是一名优秀的程序员,十分优秀!