注:本程序是在 vs2019社区版环境下运行的
先记录下,具体的细节和原理晚点再补充
代码如下
#include <iostream>
#include <vector>
#include <string>
#include <windows.h>
#include <thread>
#include <future>
struct MyStruct
{
int number;
std::string strText;
};
MyStruct threadTask_1(bool bChange, int number,std::string text) {
Sleep(number * 200);
int showNumber = number;
if (bChange)
{
showNumber = showNumber * 100;
}
MyStruct result;
result.number = number;
result.strText = text + "__" + std::to_string(showNumber);
return result;
}
int main() {
std::vector<MyStruct> vecResult;
std::vector<std::future<MyStruct>> vecFu;
char chTemp = 'a';
std::string ziduan;
for (size_t i = 0; i < 20; i++)
{
ziduan += chTemp;
chTemp += 1;
std::packaged_task<MyStruct(bool, int, std::string)> task(threadTask_1);
bool bChange = false;
if (i % 2 == 0)
{
bChange = true;
}
vecFu.push_back(task.get_future());
std::thread thTask (std::move(task), bChange,i, ziduan);
thTask.detach();
}
for (auto & r : vecFu)
{
r.wait();
MyStruct stTemp = r.get();
vecResult.push_back(stTemp);
}
for (const auto& stTemp : vecResult)
{
std::cout << stTemp.number << " " << stTemp.strText << std::endl;
}
Sleep(2);
}
运行结果