方法
GLibSourceis_destroyed
从:2.12
声明 [src]
gboolean
g_source_is_destroyed (
GSource* source
)
描述 [src]
返回值表示 source
是否已被销毁。
当您在空闲处理程序中操作对象,但可能在该空闲处理程序调度之前释放了对象时,这是很重要的。
static gboolean
idle_callback (gpointer data)
{
SomeWidget *self = data;
g_mutex_lock (&self->idle_id_mutex);
// do stuff with self
self->idle_id = 0;
g_mutex_unlock (&self->idle_id_mutex);
return G_SOURCE_REMOVE;
}
static void
some_widget_do_stuff_later (SomeWidget *self)
{
g_mutex_lock (&self->idle_id_mutex);
self->idle_id = g_idle_add (idle_callback, self);
g_mutex_unlock (&self->idle_id_mutex);
}
static void
some_widget_init (SomeWidget *self)
{
g_mutex_init (&self->idle_id_mutex);
// ...
}
static void
some_widget_finalize (GObject *object)
{
SomeWidget *self = SOME_WIDGET (object);
if (self->idle_id)
g_source_remove (self->idle_id);
g_mutex_clear (&self->idle_id_mutex);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
如果由于回调中的使用后释放,在空闲处理程序触发之前销毁了小部件,则这将在多线程应用程序中失败。针对这个特定问题的解决方案是在回调中检查源是否已被销毁。
static gboolean
idle_callback (gpointer data)
{
SomeWidget *self = data;
g_mutex_lock (&self->idle_id_mutex);
if (!g_source_is_destroyed (g_main_current_source ()))
{
// do stuff with self
}
g_mutex_unlock (&self->idle_id_mutex);
return FALSE;
}
从除 GMainContext
外的线程调用此函数通常是多余的,因为源可能在返回此函数后立即被销毁。然而,一旦源被销毁,就不能再将其销毁,因此您可以从任何线程进行机会性检查。
自 2.12 起提供