有人可以告诉我如何创建一个非阻塞计时器来删除结构的数据吗? 我有这个结构:
struct info{
char buf;
int expire;
};
现在,在expire的值结束时,我需要将数据删除到我的struct中。事实是,在同一时间,我的计划正在做其他事情。那我怎么能创造这个呢?甚至避免使用信号。
答案 0 :(得分:1)
如果您不想使用信号,那么您将需要某种线程。任何更具体的答案将取决于您正在使用的操作系统和工具链。
答案 1 :(得分:1)
它不会起作用。删除结构所花费的时间很可能比安排稍后删除结构所花费的时间少得多。原因是为了稍后删除结构,必须创建一些结构来保存查找结构所需的信息,以便我们在以后删除它时。然后,最终需要释放该结构本身。对于如此小的任务,它不值得调度的开销。
在不同的情况下,删除非常复杂,可能是值得的。例如,如果结构包含包含许多必须遍历以销毁每个子元素的子元素的列表或映射,则可能值得调度线程来执行删除。
详细信息取决于您使用的平台和线程标准。但基本的想法是,在某个地方你有一个函数会导致一个线程的任务是运行一个特定的代码块。
更新:嗯,等一下,计时器?如果代码不能访问它,为什么不立即删除它?如果代码要访问它,为什么现在设置计时器?你的问题有些可疑。不要考虑安排删除任何内容,直到所有内容都100%完成。
答案 2 :(得分:0)
我认为座右铭是拥有一个计时器,如果它在Client Server逻辑的情况下过期。您需要删除时间已过期的条目。当计时器到期时,您需要删除该数据。 如果是:那么它可以通过几种方式实现。 a)单线程:根据(interval-now)逻辑的差异创建排序队列。因此,最短的跨度应首先接收回调。您可以使用C ++中的map实现计时器队列。现在,当你的工作结束时,只需调用timer函数来检查队列中是否有任何过期的请求。如果是,那么它将删除该数据。所以原型可能看起来像set_timer(void( pf)(void )); add_timer(void * context,long time_to_expire);添加计时器。
b)多线程:add_timer逻辑将是相同的。它将访问全局地图并在锁定后添加它。该线程将在映射中以最短的时间休眠(使用条件变量)。同时,如果定时器队列有任何添加,它将从线程获得添加数据的通知。为什么它需要在条件变量上休眠,因为它可能得到一个定时器,其间隔小于已经存在的最小值。 所以假设从现在起第一次通话是5秒 第二个计时器从现在开始是3秒。 因此,如果计时器线程只是睡眠而不是条件变量,那么它将在5秒后唤醒,而预计会在3秒后唤醒。
希望这能澄清你的问题。 欢呼声,