0

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 プラグマを使用する必要がありますか? 時々、そのループでエラーが発生しました。1 スレッド バージョンは正常に動作します。

4

1 に答える 1

1

いいえ。GLibリファレンスマニュアルのスレッドセクションから:

GLib 自体は内部的に完全にスレッドセーフです (すべてのグローバル データは自動的にロックされます) が、個々のデータ構造インスタンスはパフォーマンス上の理由から自動的にロックされません。たとえば、複数のスレッドから同じGHashTableへのアクセスを調整する必要があります。この規則からの 2 つの注目すべき例外はGMainLoopGAsyncQueue です。これらはスレッドセーフであり、複数のスレッドからアクセスするためにアプリケーション レベルのロックを追加する必要はありません。などのほとんどの参照カウント関数g_object_ref()もスレッドセーフです。

于 2012-10-07T19:01:26.383 に答える