1

Javascript は非同期プログラミングを容易にします。uniflow の代わりにコールバックを使用した非同期プログラミングは C で可能ですか? (または C++)

PS: C# 5.0 で実装されていることは明らかです。

編集:

C および C++ の nodejs に似たフレームワークは何ですか?

編集 2: 非同期プログラミングは、マルチスレッド (大規模なユーザー アプリケーションにとって重要です) を必要とせずにユーザーをスケールアップするのに役立ちます。

4

3 に答える 3

8

スレッド、関数ポインター、ファンクター、ラムダを操作する必要がある場合や、専用のライブラリーを使用することができます。まあ、すべて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はすぐに戻り、後でクライアントが接続するとコールバックを呼び出します。この場合、このコールバックはラムダ関数です。からの新機能C++11

于 2013-08-18T18:43:34.980 に答える
2

もちろん。簡単な解決策を考えてみてください: 何らかのソース (内部または外部) からメッセージを受け取るスレッドを作成すると、このスレッドは、定義されたデータに応じて、1 つまたは複数のクラス内のルーチンにメッセージをディスパッチします (どのクラスを送信するかを示す文字列など)。呼び出し、またはプラグインがスレッドに登録する ID など)。

このルーチンが処理を完了すると、メッセージをメイン システムに送り返し、システムの残りの部分と同じようにメッセージをディスパッチします。プラグインはサーバー プロセスである必要はありませんが、ネットワーク クライアントへのソケットにすることができます。例えば。

最終的な結果: 双方向の非同期コールバック。実装が本当に簡単で、従来のスレッド化の問題もありません。これには単一のスレッドで実行できるという利点もありますが、ディスパッチ キューのメッセージを受け取り、それらを並行して処理するスレッドのプールを持つことができない理由はありません。したがって、node.js が行う方法でスケーリングします。 t。

非同期プログラミングはスケーリングにはあまり役に立ちません。ノードの場合、ネットワーク トラフィック自体のコストが多くの小さなタスクを上回るネットワーク プログラミング用にノードが設計されているため、たまたま機能するだけです。

于 2013-08-18T18:58:36.623 に答える