LINUX.ORG.RU

Скрещивание glib и OpenMP

 , ,


0

1

Как использовать g_hash_table с openmp? Код выглядит примерно так:

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);
    if (!value) {
        obj = (struct blah_blah *)value;
    } else {
        compute_obj
        g_hash_table_insert(dict, key, obj);
    }
    do_something_with_obj
}
Собственно хочу это дело распараллелить.
По идее только вставку в хэш нужно сделать критичной (critical), или что-либо ещё? Либо вообще ничего делать не нужно?
Это дело распараллелил, но вот иногда, нечасто, вылетает в этом цикле.
P.S. Прощу прощения за мой английский

★★★★

Последнее исправление: aptyp (всего исправлений: 1)

Не знаю как там с openmp, но вообще если таблица не thread safe, то синхронизировать надо и lookup и insert. Допустим если таблица занимается разрешением коллизий, то lookup в этот момент может вернуть совершенно непонятно что. Кроме того по хорошему и сам obj надо синхронизировать, т.к. вдруг какой-то поток (в будущем) случайно его удалит.

invy ★★★★★
()
Ответ на: комментарий от aptyp

выделенная область памяти куда указывают obj и value общая для всех, вот с ней надо аккуратно :)

invy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.