考慮以下代碼:
#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <future>
std::mutex mutex;
int generate()
{
static int id = 0;
std::lock_guard<std::mutex> lock(mutex);
id ;
std::cout << id << '\n';
return id;
}
int main()
{
std::vector<std::future<int>> vec;
std::vector<int> result;
for(int i = 0; i < 10; i)
{
vec.push_back(std::async(std::launch::async,generate));
}
for(int i = 0; i < 10; i)
{
result.push_back(vec[i].get());
}
std::cout << "\n result:";
for(const auto res : result)
{
std::cout << res << " ";
}
}
產生以下輸出:
1
2
3
4
5
6
7
8
9
10
result:1 2 3 6 4 5 7 8 9 10
如您所見,generate()
函式內部的輸出具有正確的(從 1 到 10)順序。但是當迭代結果向量時,每次運行我都會得到不同的順序。為什么會發生這種情況,如何同步此類代碼?
uj5u.com熱心網友回復:
您在最終輸出中看到的是執行緒產生結果的順序。
將這三個執行緒視為簡化版本:
- - - - - -
Thread | 1 | | 2 | | 3 |
- - - - - -
Result | | | | | |
- - - - - -
現在,無論它們執行哪個順序并獲取互斥鎖,輸出都將是
1 2 3
因為id
is static
,第一個“儲物柜”增加它并列印“1”,然后第二個增加它并列印“2”,依此類推。
讓我們假設執行緒 3 首先獲得互斥鎖,然后是 1,然后是 2。
這導致了這種情況:
- - - - - -
Thread | 1 | | 2 | | 3 |
- - - - - -
Result | 2 | | 3 | | 1 |
- - - - - -
當您以“矢量順序”列印結果時,您會看到
2 3 1
如果您希望執行緒以某種預定順序執行,則需要進一步同步它們。
uj5u.com熱心網友回復:
如果您立即解決未來,那么它將是按順序排列的。例如:
#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <future>
std::mutex mutex;
int generate()
{
static int id = 0;
std::lock_guard<std::mutex> lock(mutex);
id ;
std::cout << id << '\n';
return id;
}
int main()
{
std::vector<std::future<int>> vec;
std::vector<int> result;
for(int i = 0; i < 10; i)
{
int result = std::async(std::launch::async,generate).get();
result.push_back(result);
}
std::cout << "\n result:";
for(const auto res : result)
{
std::cout << res << " ";
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/508478.html