g_ptr_array_add() 在 GLib 线程中安全吗?
Is g_ptr_array_add () in GLib thread safe?
文档说:
void g_ptr_array_insert (GPtrArray *array,
gint index_,
gpointer data);
Inserts an element into the pointer array at the given index. The
array will grow in size automatically if necessary.
g_ptr_array_add() 的相同问题。
文档没有提及这些函数的线程安全性。以下函数被明确描述为线程安全的:
g_ptr_array_free ()
g_ptr_array_ref()
g_ptr_array_unref ()
如果多个线程同时对同一个指针数组执行g_ptr_array_insert() 会怎样?我必须自己提供线程安全吗?
不,它不是线程安全的(正如 几乎 所有 GLib 数据类型;source,请参阅“您必须协调访问……”)。很有可能
两个线程同时进入标记行。
static void
g_ptr_array_maybe_expand (GRealPtrArray *array,
gint len)
{
if ((array->len + len) > array->alloc)
{
guint old_alloc = array->alloc;
array->alloc = g_nearest_pow (array->len + len);
array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
array->pdata = g_realloc (array->pdata, sizeof (gpointer) * array->alloc); // here
if (G_UNLIKELY (g_mem_gc_friendly))
for ( ; old_alloc < array->alloc; old_alloc++)
array->pdata [old_alloc] = NULL;
}
}
void
g_ptr_array_add (GPtrArray *array,
gpointer data)
{
GRealPtrArray *rarray = (GRealPtrArray *)array;
g_return_if_fail (rarray);
g_ptr_array_maybe_expand (rarray, 1);
rarray->pdata[rarray->len++] = data;
}
使用例如 GMutex
.
提供您自己的锁定
文档说:
void g_ptr_array_insert (GPtrArray *array,
gint index_,
gpointer data);
Inserts an element into the pointer array at the given index. The array will grow in size automatically if necessary.
g_ptr_array_add() 的相同问题。
文档没有提及这些函数的线程安全性。以下函数被明确描述为线程安全的:
g_ptr_array_free ()
g_ptr_array_ref()
g_ptr_array_unref ()
如果多个线程同时对同一个指针数组执行g_ptr_array_insert() 会怎样?我必须自己提供线程安全吗?
不,它不是线程安全的(正如 几乎 所有 GLib 数据类型;source,请参阅“您必须协调访问……”)。很有可能 两个线程同时进入标记行。
static void
g_ptr_array_maybe_expand (GRealPtrArray *array,
gint len)
{
if ((array->len + len) > array->alloc)
{
guint old_alloc = array->alloc;
array->alloc = g_nearest_pow (array->len + len);
array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
array->pdata = g_realloc (array->pdata, sizeof (gpointer) * array->alloc); // here
if (G_UNLIKELY (g_mem_gc_friendly))
for ( ; old_alloc < array->alloc; old_alloc++)
array->pdata [old_alloc] = NULL;
}
}
void
g_ptr_array_add (GPtrArray *array,
gpointer data)
{
GRealPtrArray *rarray = (GRealPtrArray *)array;
g_return_if_fail (rarray);
g_ptr_array_maybe_expand (rarray, 1);
rarray->pdata[rarray->len++] = data;
}
使用例如 GMutex
.