我试图做一个示例线程程序,其中线程的产生是在while循环中。我不想生成多个线程。无论线程是否完成执行,while循环都应该继续运行。在while循环中调用上述线程的.get()函数。同样,只有在线程正确执行时才需要调用它。
我的代码如下:
#include <iostream>
#include <future>
#include <thread>
#include <chrono>
int thread(int varJ)
{
std::cout<<"\t\t"<<varJ<<std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
return varJ;
}
int main()
{
int varI = 0;
std::future<int> future = std::async(std::launch::async, [](){return 0;});
std::future_status status;
bool flag = false;
while(1)
{
status = future.wait_for(std::chrono::milliseconds(0));
if(status == std::future_status::ready && !flag)
{
future = std::async(std::launch::async, thread, varI);
flag = true;
}
status = future.wait_for(std::chrono::milliseconds(0));
if(status == std::future_status::ready && flag)
{
std::cout << "\t result is " << future.get() << '\n';
future = std::async(std::launch::async, [](){return 0;});
flag = false;
}
varI++;
}
}
获得的输出:
0
result is 0
865
result is 865
1723
result is 1723
2632
result is 2632
3590
result is 3590
4551
result is 4551
5509
result is 5509
输出正如我预期的那样。 现在,考虑这样一个事实,即在线程内部进行的函数调用来自另一个依赖于boost库和cuda库的库,并导致代码中的一些未知错误导致它崩溃。这是对第三方库的调用,我不想最终尝试修复该错误,但是想探索除异步之外的其他选项。
可以为代码提供哪些不同的方法来展示我在上面提到的代码中使用async的相同输出。使用boost :: thread和p_thread是两个选项,但我无法使用任何这些方法获得类似于此程序的代码。