我有一個優先級佇列,比較函式參考了多個執行緒訪問的值。所以它必須受到互斥鎖的保護。除了我不知道這個比較函式什么時候運行。它是在我推送一個值時運行還是在我彈出一個值時運行?下面的示例代碼。
#include <iostream>
#include <queue>
#include <mutex>
using namespace std;
int main()
{
int compare = 7;
mutex compare_m;
auto cmp = [&](int a, int b) {return abs(compare - a)>=abs(compare-b);};
priority_queue<int, vector<int>, decltype(cmp)> x(cmp);
mutex x_m;
//in thread
{
scoped_lock m1(x_m);
//do I need this?
scoped_lock m(compare_m);
x.push(6);
}
//in thread
{
scoped_lock m1(x_m);
//do I need this?
scoped_lock m(compare_m);
x.pop();
}
}
uj5u.com熱心網友回復:
要回答這個問題,如果沒有記錄任何事情都可能發生(然后我們無法推斷何時呼叫比較器)。
如果我們看一下 cppreference,push是根據push_heap定義的,然后它將元素重新組織成一個堆。鑒于它需要重新組織,我們可以推斷它呼叫了比較器。類似的情況發生在pop
, 呼叫pop_heap
上,它再次修改了底層堆。再次呼叫比較器。
因此,上述內容意味著您需要對兩者都有一個關鍵部分(但是請注意有關在 pq 包含元素時更改比較函式的行為是否真的安全的評論)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/470131.html
下一篇:異步未來執行緒執行器