g_hash_table and OpenMp

g_hash_table and OpenMp

本文关键字:OpenMp and hash table      更新时间:2023-10-16

g_hash_table_lookupg_hash_table_insert线程安全的吗?我可以使用这样的代码吗:

dict = g_hash_table_new();
for (i = 0; i < N; i++) {
    compute_A();
    find_hash_of_A();
    void *value = g_hash_table_lookup(dict, key);
    struct MyStruct *obj;
    if (!value) {
        obj = (struct MyStruct *)value;
    } else {
        compute_obj
        g_hash_table_insert(dict, key, obj);
    }
    do_something_with_obj
}

#pragma omp parallel for,或者我需要使用其他一些 OpenMP 编译指示?有时我在那个循环中遇到错误。单线程版本工作正常。

No. 从 GLib 参考手册的线程部分:

GLib 本身在内部是完全线程安全的(所有全局数据都会自动锁定),但由于性能原因,单个数据结构实例不会自动锁定。例如,您必须协调从多个线程对同一 GHashTable 的访问。此规则的两个值得注意的例外是 GMainLoop 和 GAsyncQueue,它们是线程安全的,不需要进一步的应用程序级锁定即可从多个线程访问。大多数 refcount 函数(如 g_object_ref())也是线程安全的。