当前位置: 首页> 健康> 养生 > 建筑资质办理_什么是seo搜索_免费网站做seo_网络推广主要是做什么工作

建筑资质办理_什么是seo搜索_免费网站做seo_网络推广主要是做什么工作

时间:2025/7/9 22:22:02来源:https://blog.csdn.net/weixin_51883798/article/details/143653556 浏览次数:0次
建筑资质办理_什么是seo搜索_免费网站做seo_网络推广主要是做什么工作

本文内容由智谱清言产生。

什么是异步编程? 

异步编程(Asynchronous Programming)是一种编程范式,它允许程序在等待某些操作(如I/O操作网络请求定时器等)完成时继续执行其他任务,而不是阻塞主线程。

这是提高程序响应性和效率的一种方式,特别是在处理大量并发操作时。

以下是异步编程的一些关键概念:

同步与异步

  • 同步编程:在同步编程中,程序按照它们在代码中出现的顺序依次执行。如果一个操作需要花费较长时间(例如,网络请求磁盘I/O),整个程序会等待该操作完成,这期间程序无法执行其他任务。

  • 异步编程:在异步编程中,程序可以在等待一个操作完成的同时继续执行其他操作。这意味着程序可以在发起一个耗时的操作后,立即继续执行后续的代码,而不是等待该操作完成。

异步编程的关键元素

  • 回调函数(Callbacks):这是最简单的异步编程技术。一个函数(回调)在某个操作完成后被调用。

  • 承诺(Promises):这是一种更现代的异步编程方法,它提供了一种更优雅的方式来处理异步操作的结果和错误。

  • 异步函数(Async/Await):这是ES2017中引入的JavaScript特性,它允许使用同步风格的代码来编写异步逻辑。

异步编程的工作流程

  1. 发起异步操作:程序发起一个异步操作,如网络请求文件读取

  2. 继续执行:发起操作后,程序不会等待该操作完成,而是继续执行后续的代码

  3. 处理结果:当异步操作完成时,程序通常会调用一个回调函数解析一个承诺来处理操作的结果。

异步编程的优势

  • 提高性能:异步编程可以避免阻塞主线程,从而提高程序的响应性和吞吐量。

  • 更好的资源利用:在等待I/O操作完成时,CPU可以执行其他任务,而不是空闲等待。

  • 更流畅的用户体验:在GUI应用程序中,异步编程可以确保界面在执行耗时操作时仍然保持响应。

异步编程的挑战

  • 回调地狱:在不使用现代异步编程技术(如Promises和Async/Await)时,代码可能会陷入回调嵌套,导致难以阅读和维护。

  • 错误处理:异步编程中的错误处理通常比同步编程更复杂。

  • 并发控制:管理多个异步操作之间的依赖关系并发执行可能比较复杂。

---------

回调函数如何实现异步操作?

在 C++ 中,回调函数实现异步操作通常涉及多线程异步 I/O 操作事件循环。以下是一个使用线程和回调函数实现异步操作的示例:

步骤 1: 定义回调函数类型

首先,定义一个函数指针类型,它将作为回调函数的类型。

#include <iostream>
#include <thread>
#include <functional>// 定义回调函数类型
using Callback = std::function<void(int)>;// 异步操作的函数
void asyncOperation(int param, Callback callback) {// 模拟耗时操作std::this_thread::sleep_for(std::chrono::seconds(1));// 调用回调函数callback(param);
}

步骤 2: 创建异步任务

然后,在另一个线程中执行异步操作,并传递回调函数。

void performAsyncWork() {// 定义一个回调函数Callback callback = [](int result) {std::cout << "异步操作完成,结果是: " << result << std::endl;};// 启动一个新线程来执行异步操作std::thread workerThread(asyncOperation, 42, callback);// 可以选择立即分离线程或稍后加入workerThread.detach(); // 或者 workerThread.join();
}

步骤 3: 执行异步任务

最后,在程序的主函数中调用 performAsyncWork 来执行异步任务。

int main() {performAsyncWork();// 为了演示,这里让主线程等待足够的时间以确保异步操作能够完成std::this_thread::sleep_for(std::chrono::seconds(2));return 0;
}
在这个例子中,asyncOperation 函数模拟了一个耗时操作,并在操作完成后调用传递给它的回调函数。这个函数在一个单独的线程中运行,因此不会阻塞主线程。

注意事项:

  • 线程管理:创建线程时要确保正确管理线程的生命周期,避免资源泄漏。使用 detach 或 join 来管理线程。
  • 线程安全:如果回调函数访问共享资源,需要确保线程安全,可能需要使用互斥锁等同步机制。
  • 异常安全:确保异步操作中的异常被正确处理,避免未捕获的异常导致程序崩溃。

C++11 引入了 <thread> 和 <functional> 库,这使得创建和管理线程以及使用回调函数变得更加方便。此外,C++11 还引入了 std::async 和 std::future,这些工具可以提供更高级的异步编程模型。

---------

承诺(Promises)是现代异步编程中的一种重要概念,它提供了一种更加清晰和链式的方式来处理异步操作的结果和错误。在 JavaScript 中,Promises 是非常核心的一部分,而在 C++ 中,从 C++11 开始,通过 std::future 和 std::async 提供了类似的功能。

以下是如何在 C++ 中使用 std::future 和 std::promise 来实现类似于 JavaScript 中 Promises 的行为:

步骤 1: 创建 std::promise 和 std::future

首先,创建一个 std::promise 对象和一个关联的 std::future 对象。

#include <future>
#include <iostream>
#include <thread>void performAsyncWork(std::promise<int> prom) {// 模拟耗时操作std::this_thread::sleep_for(std::chrono::seconds(1));// 设置结果prom.set_value(42); // 成功完成时设置值// 如果发生错误,可以调用 prom.set_exception(std::make_exception_ptr(std::runtime_error("错误信息")));
}

步骤 2: 在另一个线程中执行异步操作

然后,在另一个线程中执行异步操作,并通过 std::promise 传递结果。

int main() {// 创建 promise 和 future 对象std::promise<int> promise;std::future<int> future = promise.get_future();// 启动一个新线程来执行异步操作std::thread workerThread(performAsyncWork, std::move(promise));// 获取异步操作的结果try {int result = future.get(); // 这将阻塞,直到 future 准备好std::cout << "异步操作完成,结果是: " << result << std::endl;} catch (const std::exception& e) {std::cerr << "异步操作失败: " << e.what() << std::endl;}// 等待线程完成workerThread.join();return 0;
}

注意事项:

  • std::future 对象可以通过 get() 方法来获取异步操作的结果,这个调用会阻塞直到结果准备好。
  • 如果异步操作中发生了异常,get() 方法会抛出异常,可以通过 try-catch 块来捕获和处理。
  • std::promise 只能设置一次结果,一旦设置,就不能再更改。
  • std::future 和 std::promise 是一对一的关系,每个 future 对应一个 promise
关键字:建筑资质办理_什么是seo搜索_免费网站做seo_网络推广主要是做什么工作

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: