g_hash_table и OpenMp

Являются 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?
Временами я получал ошибку в этом цикле. Однопоточная версия работает нормально.

0

Решение

Нет. Из Раздел Темы Справочного руководства GLib:

Сам GLib является внутренне полностью поточно-ориентированным (все глобальные данные автоматически блокируются), но отдельные экземпляры структуры данных не блокируются автоматически по соображениям производительности. Например, вы должны координировать доступ к тому же GHashTable из нескольких потоков. Два заметных исключения из этого правила GMainLoop а также GAsyncQueue, которые являются поточно-ориентированными и не требуют дополнительной блокировки на уровне приложения для доступа из нескольких потоков. Большинство функций пересчета, таких как g_object_ref() также потокобезопасны.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]