【问题标题】:Updating variable every x minutes每 x 分钟更新一次变量
【发布时间】:2014-02-27 16:50:43
【问题描述】:

我有一个小程序,它使用 glib。 您可以在 codereview 中看到它。标题是“阅读消息。有什么可以做得更好?”。 我在 main 方法中有一个无休止的 while 循环。 在这个循环中,我有一个 GTree。

int main()
{
  //some setup/mallocs
  GTree* t = g_tree_new_full((GCompareDataFunc)g_ascii_strcasecmp,NULL,free_data,free_data);
  while (1) {
     //some tasks; accessing tree   
  } 
  //some free
}

在此循环内访问树。 我希望每 x 分钟(例如每 15 分钟)更新一次这棵树。 可能吗?我怎样才能做到这一点并避免碰撞?

【问题讨论】:

  • 创建两个线程。在函数中编写更新树部分。从一个线程调用函数并休眠 15 分钟。另一个线程可以做日常工作。
  • 这可行,但请记住,与 glib 中的大多数数据结构一样,GTree 不是线程安全的,因此如果您想同时从多个线程访问它需要使用外部同步原语(即互斥体)。

标签: c ipc glib


【解决方案1】:

不要在代码中使用 while (1) { ... },而是使用 GLib's main event loop。除了使这更容易之外,它还允许您与其他基于主循环的代码集成,例如 GTK+、GIO 中的异步函数和其他库。

gboolean every_15_minutes (gpointer user_data) {
  /* some tasks; accessing tree */
}

int main (void) {
  GMainLoop* loop = g_main_loop_new (NULL, FALSE);
  /* some setup/mallocs */
  GTree* t = g_tree_new_full((GCompareDataFunc)g_ascii_strcasecmp,NULL,free_data,free_data);
  g_timeout_add_seconds (60 * 15, every_15_minutes, NULL);
  g_main_loop_run (loop);
  /* some free */
}

至于避免冲突,您可以执行g_tree_lookup 以验证在g_tree_insert 之前没有任何具有该键的现有条目,或者只执行g_tree_replace,如果存在则丢弃旧值碰撞。

【讨论】:

  • 我的意思是,我不想在 while (1) {} 循环中访问树时插入/更新树(在 every_15_minutes 函数中)。也许你没有让我正确。我希望有一个访问树的循环,此外我想每 15 分钟修改一次这棵树。
  • 您可以向主循环添加多个回调。它们甚至不必基于超时——它们可以基于 I/O 可用性,或者甚至只是在循环空闲时执行。
  • 我明白了。它保存了吗?我不需要任何回调块吗?
  • 主循环不会创建线程,所以除非你在别处创建线程,否则你不需要担心线程安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多