方法

GLibCondwait_until

自: 2.32

声明 [源]

gboolean
g_cond_wait_until (
  GCond* cond,
  GMutex* mutex,
  gint64 end_time
)

描述 [源]

等待直到 cond 被信号或者 end_time 已经过。

g_cond_wait() 类似,可能出现虚假或窃取唤醒。因此,在条件变量上等待时,应始终在一个基于显式检查的谓词的循环中进行。

如果条件变量被信号(或遇到虚假唤醒),则返回 TRUE。如果 end_time 已过,则返回 FALSE

以下代码展示了如何正确地在条件变量上执行定时等待(扩展了 GCond 文档中的示例)

gpointer
pop_data_timed (void)
{
  gint64 end_time;
  gpointer data;

  g_mutex_lock (&data_mutex);

  end_time = g_get_monotonic_time () + 5 * G_TIME_SPAN_SECOND;
  while (!current_data)
    if (!g_cond_wait_until (&data_cond, &data_mutex, end_time))
      {
        // timeout has passed.
        g_mutex_unlock (&data_mutex);
        return NULL;
      }

  // there is data for us
  data = current_data;
  current_data = NULL;

  g_mutex_unlock (&data_mutex);

  return data;
}

请注意,结束时间是在进入循环之前计算一次的,并在循环中使用。这是在这个 API 上使用绝对时间的动机 — 如果直接将 5 秒的相对时间传递给调用,并且发生虚假唤醒,则程序将不得不重新开始等待(这将导致总等待时间超过 5 秒)。

自: 2.32

参数

mutex

类型: GMutex

当前被锁定的一个 GMutex

数据由方法的调用者拥有。
end_time

类型: gint64

等待到的单调时间。

返回值

类型: gboolean

在信号上返回 TRUE,在超时上返回 FALSE