1

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

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

编辑:

在 C 和 C++ 中有哪些类似于 nodejs 的框架?

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

4

3 回答 3

8

您可能需要操作线程、函数指针、函子、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 函数;的一项新功能C++11

于 2013-08-18T18:43:34.980 回答
2

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

当此例程完成处理时,它会将消息发送回主系统,主系统会像处理系统的其余部分一样分派它 - 插件不必是服务器进程,但可以是网络客户端的套接字,例如。

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

异步编程并不能真正帮助扩展 - 在节点的情况下它恰好可以工作,因为节点是为网络编程而设计的,其中许多小任务被网络流量本身的成本所抵消。

于 2013-08-18T18:58:36.623 回答
2

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

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

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

于 2013-08-18T19:22:29.030 回答