![](/img/trans.png)
[英]std::future or std::shared_future to wait for multiple threads
[英]Reacting threads needing its OWN COPY of the std::shared_future that refers to the share state
我有一個關於有效現代C ++第270頁的問題,由Scott Meyers編寫。
在第5/6行,他寫道:“唯一的微妙之處在於,每個反應線程都需要自己擁有的std :: shared_future自己的COPY,它指的是共享狀態,......”
我的問題是:為什么我們有義務將std::shared_future
的副本傳遞給每個線程中的每個lambda函數? 雖然先驗,我沒有看到通過引用傳遞它的任何問題,這樣有一個獨特的共享狀態將由不同的線程使用?
我寫了一本改編自斯科特邁耶斯博士的書的代碼,即使我通過了參考文獻,也可以使用。
因此,是否可以通過引用傳遞它?
#include <future>
#include <vector>
std::promise<void> p;
void react(){}
void detect()
{
auto sf = p.get_future().share();
std::vector<std::thread> vt;
int n=10;
for(int i=0;i < n; i++)
{
vt.emplace_back([sf]{sf.wait();
react();
});
}
p.set_value();
for(auto& t : vt)
t.join();
}
int main()
{
detect();
return 0;
}
如果通過引用傳遞,則多個線程正在訪問shared_future
的同一實例。 這可能導致數據競爭並且是未定義的行為。 如果多個線程通過自己的shared_future
副本訪問共享狀態,則庫會確保它們已同步。
get
上的cppreference頁面說:
它有效地調用
wait()
以等待結果。
並且wait
的cppreference頁面說:
從多個線程調用相同的
std::shared_future
是不安全的; 預期用途是在等待相同共享狀態的每個線程上擁有std::shared_future
的副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.