2

次の例では:

ワーカー スレッドはベクトルに何かを追加します。

std::lock_guard<std::mutex> guard(UI::GetInstance().my_mutex);

UI::GetInstance().my_vector.push_back(new_value);

UI スレッドはリストをチェックします。

while (true) {
    std::lock_guard<std::mutex> guard(my_mutex);

    //perform my_vector operations and clear at the end
    my_vector.clear();
}

反復ごとにロックを保護するのは好きではありません。これに対するより良いアプローチはありますか? 私はそのようなフラグを設定したいと思っていましたが、ブール値がスレッドセーフかどうかはわかりません:

ワーカー スレッドはベクトルに何かを追加します。

std::lock_guard<std::mutex> guard(UI::GetInstance().my_mutex);

UI::GetInstance().my_vector.push_back(new_value);
UI::GetInstance().my_vector_changed=true; // set a flag

UI スレッドはリストをチェックします。

while (true) {
    if (my_vector_changed) { // only lock on changes
        std::lock_guard<std::mutex> guard(my_mutex);
        //perform my_vector operations and clear at the end
        UI::GetInstance().my_vector.clear();
        my_vector_changed=false;
    }
}

ガードをロックするためのより良いアプローチはありますか?

4

1 に答える 1

6

この種の「誰かがそのミューテックスによって保護されているデータに興味深いことをした」という通知は、条件変数の目的であり、condition_variable代わりに a を使用してください。

あなたのテクニックについて: それはあなた自身の cv をローリングするようなものですが、そうする場合は、それへのアクセスを同期する必要があるboolことを確認してatomic<bool>ください。atomic_flag

于 2013-07-01T20:43:19.293 に答える