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.

提供您自己的锁定