【发布时间】:2015-06-16 11:39:11
【问题描述】:
这是来自 g_cond_wait() 的 Glib 文档中的一个示例:
gpointer current_data = NULL;
GMutex data_mutex;
GCond data_cond;
void push_data (gpointer data)
{
g_mutex_lock (&data_mutex); // (3)
current_data = data;
g_cond_signal (&data_cond);
g_mutex_unlock (&data_mutex); // (4)
}
gpointer pop_data (void)
{
gpointer data;
g_mutex_lock (&data_mutex); // (1)
while (!current_data)
g_cond_wait (&data_cond, &data_mutex); // (2)
data = current_data;
current_data = NULL;
g_mutex_unlock (&data_mutex); // (5)
return data;
}
现在让我们来看看这个:
- 第一个线程调用
pop_data(),data_mutex被锁定(1) -
g_cond_wait()被调用,data_mutex被解锁(2),第一个线程正在等待 - 第二个线程调用
push_data(),data_mutex被锁定(3) - 第二个线程通知第一个线程等待条件满足,解锁
data_mutex(4) - 第一个线程唤醒,从
g_cond_wait()退出并再次解锁data_mutex(5)
文档说解锁未锁定的互斥锁是未定义的。这是否意味着该示例包含错误?或者g_cond_wait()会在退出前锁定互斥锁吗?
【问题讨论】:
标签: c multithreading glib