g_hash_table_lookup
和g_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 pragma?
有时我在那个循环中遇到错误。一个线程版本工作正常。
答案 0 :(得分:1)
没有。来自Threads section of the GLib Reference Manual:
GLib本身在内部完全是线程安全的(所有全局数据都会自动锁定),但出于性能原因,各个数据结构实例不会自动锁定。例如,您必须协调来自多个线程的相同GHashTable的访问。此规则的两个值得注意的例外是GMainLoop和GAsyncQueue,它们是线程安全的,无需从多个线程访问进一步的应用程序级锁定。大多数引用计数函数(如
g_object_ref()
)也是线程安全的。