具有非 POD 对象的 GLib 异步队列

GLib Asynchronous Queue with non-POD objects

在使用 GLib 的 C++ 程序中,使用 non-POD objects with an Asynchronous Queue?

是安全的

基本上,非 POD 对象将作为 gpointer data 传递给

void
g_async_queue_push (GAsyncQueue *queue,
                    gpointer data);

然后用

检索
gpointer
g_async_queue_pop (GAsyncQueue *queue);

理论上这永远不会引起问题,因为 gpointer 只是 void*typedef,所以不要传递用 g_new 分配并释放的 POD 对象g_free 我可以传递用 new 分配并由 delete 释放的 POD 对象(使用适当的类型转换以避免 this)。此实现隐藏在我的 class 中,因此我是唯一控制队列的人。

但是,如果队列必须在内部释放一个指针(例如,如果在 g_async_queue_unref 之后队列被销毁,而项目仍在排队),它将调用 g_free 分配给一个对象new 也就是 bad for many reasons. The documentation for GLib 一般说将 g_new()g_free()newdelete 匹配很重要。

我知道应该避免将 C++ 类型与 C 库混合使用,但这种设计考虑超出了这个问题的范围。

只要您在创建 GAsyncQueue 时没有为元素指定自由函数(请参阅 g_async_queue_new_full()),就可以保证不会释放或重新分配存储在其中的指针。就队列而言,它们是不透明的。

您可以通过查看 the implementation 来验证这一点。