1

あるスレッドによってプッシュされ、別のスレッドによってポップされた( std::)queue / (std::)dequeがあります。キューを変更しているため、プッシュ関数とポップ関数でミューテックスをロックする必要があることはわかっていますが、front() にアクセスする場合もミューテックスをロックする必要がありますか?

私が尋ねている理由は、キューが内部でどのように編成されているかよくわからないからです。必要なときに割り当て/削除していることを読んだことがあります。他のスレッドがプッシュしている間にフロントを読んだら、フロントが移動する可能性はありますか?

イテレータはどうですか?イテレータが値を読み取っている間、ミューテックスもロックする必要がありますか?

読み取り中にミューテックスをロックすることは常に良い考えだと思いますが、すべてのイテレータ/フロントアクセスで queue.mutex 全体をロックする必要があるかどうかはわかりません。毎回ロックすると、プログラム全体が遅くなる可能性があります。

4

1 に答える 1

2

std::queuestd::dequeorをstd::list内部的に使用する単なるアダプターです。

読み取り時にキューをロックするだけでなく、条件変数を待機して、利用可能なデータがあるかどうかを確認します。この設定があれば

std::queue<int> q;
std::mutex m;
std::condition_variable cv;

その後、他のスレッドがデータを提供するのを待つことができます

std::unique_lock<std::mutex> guard(m);
while(q.empty())
    cv.wait(guard);

int n = q.front();
q.pop();

データが利用可能になったときに通知されます

cv.notify_one();

例えば。

于 2013-02-26T10:49:46.857 に答える