使用C或C++可以进行异步编程吗

Is Asynchronous Programming possible with C or C++?

本文关键字:异步 编程 C++ 使用      更新时间:2023-10-16

Javascript有助于异步编程。异步编程是否可以使用C使用回调而不是uniflow?(或C++)

PS:很明显,C#5.0已经实现了它。

编辑:

在C和C++中,与nodejs相似的框架有哪些?

编辑2:异步编程有助于在不需要多线程的情况下扩大用户规模(这对大型用户应用程序很重要)为什么常规应用程序(只有100个用户)可以采用基于回调的异步方法?

您可能需要操作线程、函数指针、函数、lambda,或者可以使用专用库。好吧,一切都可以用C++完成。

在你的评论中,你说的是NodeJS。我想你想要的是一个异步库的文件,网络。。。在这种情况下,您可以看看Boost.Asio,它简化了C++中异步编程的使用。

下面是一个快速的例子,部分来自他们的文档:

class server
{
public:
  server(boost::asio::io_service& io_service,
      const tcp::endpoint& endpoint)
    : acceptor_(io_service, endpoint)
  {
    do_accept();
  }
private:
  void do_accept()
  {
    acceptor_.async_accept(socket_,
        [this](boost::system::error_code ec)
        {
          if (!ec)
          {
            // Do your stuff here with the client socket when one arrive.
          }
          do_accept(); // Start another async call for another client.
        });
   // Your server can do some other stuff here without waiting for a client.
  }
  tcp::acceptor acceptor_;
};

这是一个异步接受某些客户端的基本服务器。函数tcp::acceptor::asyn_accept将立即返回,并在稍后客户端连接时调用回调。在我们的例子中,这个回调是一个lambda函数;这是CCD_ 3。

当然是。想想简单的解决方案:创建一个接受来自某个源(内部或外部)的消息的线程,该线程根据一些定义的数据(可能是一个字符串,说明要调用哪个类,或者插件向线程注册的某个ID,等等)将消息分派到一个或多个类中的例程。

当这个例程完成处理时,它会向主系统发送一条消息,主系统会像对系统其他部分一样调度它——例如,插件不一定是服务器进程,而是网络客户端的套接字。

最终结果:双向异步回调。实现起来非常简单,也没有传统的线程问题。这也有在单个线程中运行的好处,但没有理由不能有一个线程池来接收调度队列的消息并并行处理它们,从而以node.js没有的方式进行扩展。

异步编程并不能真正帮助扩展——在节点的情况下,它只是碰巧起作用,因为节点是为网络编程设计的,在网络编程中,许多小任务被网络流量本身的成本所抵消。

要实现回调,需要的概念有:函数指针(这样例程就知道回调什么);可重入编程风格(一个用于自动变量的堆栈,不依赖于可能被其他代码更改的全局或静态变量);线程安全代码(例如,对于XP和更高版本的Microsoft的C运行时(CRT)库是线程安全的),使得当从回调例程和主线例程输入时,像printf这样的例程将起作用;在某些情况下,串行化关键代码部分的方法。

此外,理论上回调可以从其他线程发出,因此线程安全代码是必要的。

无论如何,请注意,这些描述与操作系统和语言无关。程序员可以编写C代码来实现这些概念,也可以选择不同的语言。这实际上取决于应用程序的要求。