欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > c++中同步和异步,阻塞和非阻塞原理以及机制

c++中同步和异步,阻塞和非阻塞原理以及机制

2025/4/18 21:59:04 来源:https://blog.csdn.net/weixin_44727517/article/details/147040924  浏览:    关键词:c++中同步和异步,阻塞和非阻塞原理以及机制

在C++中,同步与异步、阻塞与非阻塞是并发编程中的重要概念,它们描述了程序在执行任务时的行为模式。理解这些概念对于设计高效、响应良好的并发程序至关重要。下面我将详细介绍这些概念的原理和机制。

1. 同步与异步

同步(Synchronous)
  • 定义:同步操作是指任务按顺序执行,一个任务完成后才开始下一个任务。在同步操作中,调用方会等待被调用方完成操作后才继续执行。

  • 原理:同步操作通常是阻塞的,调用方在等待被调用方完成时会暂停执行。

  • 机制:在C++中,普通的函数调用是同步的。例如,调用一个函数时,调用方会等待该函数执行完成并返回结果后才继续执行。

示例代码

#include <iostream>
#include <thread>
#include <chrono>void syncTask() {std::cout << "Task started." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作std::cout << "Task completed." << std::endl;
}int main() {syncTask(); // 同步调用std::cout << "Main function continues." << std::endl;return 0;
}

输出结果

Task started.
Task completed.
Main function continues.
异步(Asynchronous)
  • 定义:异步操作是指任务可以并行执行,调用方在发起操作后不会等待被调用方完成,而是继续执行后续代码。

  • 原理:异步操作通常是通过多线程、事件驱动或回调机制实现的。调用方在发起异步操作后,可以继续执行其他任务,而被调用方在后台独立完成操作。

  • 机制:在C++中,可以使用std::asyncstd::futurestd::promise等标准库功能来实现异步操作。

示例代码

#include <iostream>
#include <thread>
#include <future>
#include <chrono>void asyncTask() {std::cout << "Task started." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作std::cout << "Task completed." << std::endl;
}int main() {std::future<void> result = std::async(std::launch::async, asyncTask); // 异步调用std::cout << "Main function continues." << std::endl;result.get(); // 等待异步任务完成return 0;
}

输出结果

Task started.
Main function continues.
Task completed.

2. 阻塞与非阻塞

阻塞(Blocking)
  • 定义:阻塞操作是指调用方在等待被调用方完成操作时会暂停执行,直到操作完成。

  • 原理:阻塞操作通常会占用调用方的线程,导致调用方无法执行其他任务,直到被调用方完成操作。

  • 机制:在C++中,同步操作通常是阻塞的。例如,std::this_thread::sleep_for会阻塞当前线程。

示例代码

#include <iostream>
#include <thread>
#include <chrono>void blockingTask() {std::cout << "Task started." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(2)); // 阻塞操作std::cout << "Task completed." << std::endl;
}int main() {blockingTask(); // 阻塞调用std::cout << "Main function continues." << std::endl;return 0;
}

输出结果

Task started.
Task completed.
Main function continues.
非阻塞(Non-blocking)
  • 定义:非阻塞操作是指调用方在发起操作后不会等待被调用方完成,而是立即返回,调用方可以继续执行其他任务。

  • 原理:非阻塞操作通常会返回一个状态码或对象,表示操作是否完成。调用方可以通过轮询或回调机制来检查操作的完成状态。

  • 机制:在C++中,可以使用std::asyncstd::futurestd::promise等标准库功能来实现非阻塞操作。

示例代码

#include <iostream>
#include <thread>
#include <future>
#include <chrono>void nonBlockingTask() {std::cout << "Task started." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作std::cout << "Task completed." << std::endl;
}int main() {std::future<void> result = std::async(std::launch::async, nonBlockingTask); // 非阻塞调用std::cout << "Main function continues." << std::endl;// 模拟其他任务std::this_thread::sleep_for(std::chrono::seconds(1));std::cout << "Main function is doing other work." << std::endl;result.get(); // 等待异步任务完成return 0;
}

输出结果

Task started.
Main function continues.
Main function is doing other work.
Task completed.

3. 同步与异步、阻塞与非阻塞的结合

在实际应用中,同步与异步、阻塞与非阻塞的概念可以结合使用,以实现高效的并发编程。

同步阻塞
  • 定义:调用方等待被调用方完成操作,调用方的线程被阻塞。

  • 示例:普通的函数调用。

同步非阻塞
  • 定义:调用方等待被调用方完成操作,但调用方的线程不会被阻塞。

  • 示例:使用std::futurestd::async实现异步操作,但调用方通过result.get()等待结果。

异步阻塞
  • 定义:调用方发起异步操作,但调用方的线程被阻塞。

  • 示例:使用std::futurestd::async实现异步操作,但调用方通过result.get()等待结果。

异步非阻塞
  • 定义:调用方发起异步操作,调用方的线程不会被阻塞。

  • 示例:使用std::futurestd::async实现异步操作,调用方通过轮询或回调机制检查操作的完成状态。

4. 实现机制

多线程
  • 原理:通过创建多个线程来实现并发执行。每个线程可以独立执行任务,从而提高程序的效率。

  • 机制:在C++中,可以使用std::thread来创建线程。

示例代码

#include <iostream>
#include <thread>
#include <chrono>void task() {std::cout << "Task started." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作std::cout << "Task completed." << std::endl;
}int main() {std::thread t(task); // 创建线程std::cout << "Main function continues." << std::endl;t.join(); // 等待线程完成return 0;
}

输出结果

Task started.
Main function continues.
Task completed.
事件驱动
  • 原理:通过事件循环和回调函数来实现异步操作。事件循环会监听事件的发生,并在事件发生时调用相应的回调函数。

  • 机制:在C++中,可以使用第三方库如Boost.Asio来实现事件驱动编程。

示例代码

#include <iostream>
#include <boost/asio.hpp>void asyncTask(boost::asio::io_context& io) {std::cout << "Task started." << std::endl;boost::asio::steady_timer t(io, std::chrono::seconds(2));t.async_wait([](const boost::system::error_code& ec) {if (!ec) {std::cout << "Task completed." << std::endl;}});
}int main() {boost::asio::io_context io;asyncTask(io); // 异步任务std::cout << "Main function continues." << std::endl;io.run(); // 启动事件循环return 0;
}

输出结果

Task started.
Main function continues.
Task completed.

总结

  • 同步:任务按顺序执行,调用方等待被调用方完成操作。

  • 异步:任务可以并行执行,调用方不会等待被调用方完成操作。

  • 阻塞:调用方在等待被调用方完成操作时会暂停执行。

  • 非阻塞:调用方在等待被调用方完成操作时不会暂停执行。

在C++中,可以使用标准库中的std::threadstd::asyncstd::futurestd::promise等功能来实现同步与异步、阻塞与非阻塞的操作。选择合适的机制可以显著提高程序的效率和响应能力。

版权声明:

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

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

热搜词