c++ 异步线程示例
时间: 2023-11-24 15:50:25 浏览: 41
以下是一个C++的异步线程示例,使用了<future>库函数:
```c++
#include <iostream>
#include <future>
#include <chrono>
int main() {
// 异步执行一个函数
std::future<int> result = std::async([](){
std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作
return 42;
});
// 主线程继续执行其他操作
std::cout << "Doing something else..." << std::endl;
// 等待异步操作完成并获取结果
int res = result.get();
// 输出结果
std::cout << "Result: " << res << std::endl;
return 0;
}
```
该示例中,我们使用了std::async函数异步执行了一个函数,该函数会休眠2秒钟,然后返回整数42。在主线程中,我们可以继续执行其他操作,而不必等待异步操作完成。最后,我们使用result.get()函数等待异步操作完成并获取结果,输出结果为“Result: 42”。
相关问题
c++多线程或异步编程技术代码示例
下面是使用C++语言实现多线程和异步编程的代码示例:
多线程示例:
```cpp
#include <iostream>
#include <thread>
// 线程函数,打印数字
void printNumbers() {
for (int i = 1; i <= 10; ++i) {
std::cout << i << std::endl;
}
}
// 线程函数,打印字母
void printLetters() {
for (char letter : {'a', 'b', 'c', 'd', 'e'}) {
std::cout << letter << std::endl;
}
}
int main() {
// 创建两个线程
std::thread thread1(printNumbers);
std::thread thread2(printLetters);
// 等待两个线程执行完毕
thread1.join();
thread2.join();
std::cout << "Done!" << std::endl;
return 0;
}
```
上述代码创建了两个线程,一个打印数字,一个打印字母。两个线程可以并行执行,提高了程序的性能。
异步编程示例:
```cpp
#include <iostream>
#include <string>
#include <future>
// 异步函数,获取网站HTML内容
std::string fetchWebsite(const std::string& url) {
// 省略异步获取HTML内容的代码
return "HTML content";
}
int main() {
std::string url = "http://www.example.com";
// 异步获取网站HTML内容
std::future<std::string> futureHTML = std::async(std::launch::async, fetchWebsite, url);
// 程序可以继续执行其他任务,不必等待HTML内容返回
std::cout << "Program continues..." << std::endl;
// 等待HTML内容返回,并打印出来
std::string html = futureHTML.get();
std::cout << html << std::endl;
return 0;
}
```
上述代码使用了C++11标准的异步编程特性,异步获取一个网站的HTML内容,并打印出来。异步编程可以提高程序的响应速度和并发性。
UE5, c++ 实现异步线程执行
在 Unreal Engine 5 中,你可以使用 C++ 来实现异步线程执行。下面是一个简单的示例代码:
```cpp
#include "Async/Async.h"
// 定义一个异步任务
class MyAsyncTask : public FNonAbandonableTask
{
public:
// 构造函数传入需要执行的参数
MyAsyncTask(int32 InParam) : Param(InParam) {}
// 在异步线程中执行的任务
void DoWork()
{
// 执行一些耗时操作,比如计算或者加载资源等等
// ...
// 任务执行结束后可以将结果回调到主线程
FGraphEventRef GameThreadTask = FFunctionGraphTask::CreateAndDispatchWhenReady([&]()
{
// 在主线程中执行回调操作,可以更新UI或者其他逻辑
// ...
}, TStatId(), nullptr, ENamedThreads::GameThread);
}
// 返回任务名称
static const TCHAR* Name()
{
return TEXT("MyAsyncTask");
}
FORCEINLINE TStatId GetStatId() const
{
RETURN_QUICK_DECLARE_CYCLE_STAT(MyAsyncTask, STATGROUP_ThreadPoolAsyncTasks);
}
private:
int32 Param;
};
// 启动异步任务
void StartAsyncTask(int32 Param)
{
// 创建异步任务并提交到线程池中执行
MyAsyncTask* AsyncTask = new MyAsyncTask(Param);
AsyncTask->StartBackgroundTask();
}
```
在上面的示例代码中,我们定义了一个名为 `MyAsyncTask` 的异步任务,它继承自 `FNonAbandonableTask`,并实现了 `DoWork` 方法来执行异步线程中的任务。在 `DoWork` 方法中,你可以执行一些耗时操作,并在任务结束后通过 `FFunctionGraphTask` 将结果回调到主线程进行处理。
要启动异步任务,你可以调用 `StartAsyncTask` 函数,并传入需要执行的参数。该函数会创建一个 `MyAsyncTask` 实例,并提交到线程池中执行。
请注意,异步任务的执行是在一个单独的线程中进行的,因此你需要确保在任务中不会访问或修改与主线程共享的对象或数据,以避免潜在的竞态条件。