C 每x分钟更新一次变量

C 每x分钟更新一次变量,c,ipc,glib,C,Ipc,Glib,我有一个小程序,它使用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) {

我有一个小程序,它使用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分钟)更新一次此树。 可能吗?如何做到这一点并避免冲突?

在代码中使用while(1){…},而不是使用while(1){…}。除了使这更容易之外,它还允许您与其他基于主循环的代码集成,例如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 */
}

至于避免冲突,您可以执行a来验证a之前没有任何该键的现有条目,或者只执行a,如果发生冲突,将丢弃旧值。

创建两个线程。在函数中写入更新树部分。从一个线程调用函数并睡眠15分钟。另一个线程可以执行常规任务。这会起作用,但请记住,与glib中的大多数数据结构一样,GTree不是线程安全的,因此如果您希望同时从多个线程访问它,则需要使用外部同步原语(即互斥体)。对于冲突,我的意思是,我不想插入/更新树(在每15分钟函数中)在while(1){循环。也许你没有给我正确的答案。我希望有一个循环可以访问树,此外,我想每15分钟修改一次树。你可以向主循环添加多个回调。它们甚至不必基于超时,它们可以基于I/O可用性,甚至只要循环空闲就执行。我明白了。是这样吗ave?我不需要任何回调块吗?主循环不创建线程,因此除非在其他地方创建线程,否则不需要担心线程安全。