gpt4 book ai didi

c - SDL_AddTimer 和线程,清除定时器队列

转载 作者:太空狗 更新时间:2023-10-29 15:05:26 27 4
gpt4 key购买 nike

我正在写一个基于 FFmpeg 的媒体播放器我有一个设计问题。我的代码调用一个函数,使用 SDL 的 SDL_AddTimer 以不规则的间隔渲染视频帧。功能。我的问题是,如果我想在一个视频结束(或播放停止)而另一个视频开始时执行垃圾收集,我如何确保队列中或执行过程中没有更多计时器以避免访问突然释放的对象。

最佳答案

很多不同的方法可以根据您的具体实现来解决您的问题。一些基本的想法可以是:

  1. 定义一个 bool 值,指定玩家是否正在运行(true = running,false = not)

  2. 在每次与播放器相关的调用之前,检查该变量,如果它为 false(播放器已停止),则关闭该函数(立即返回)

  3. 然后,您调用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com