16

N3650から取った次の例を考えてみましょう:

int cnt = 0;
do {
   cnt = await streamR.read(512, buf);
   if (cnt == 0)
      break;
   cnt = await streamW.write(cnt, buf);
} while (cnt > 0);

私はおそらく何かを見逃していますが、私が理解asyncawaitていれば、効果が書くことと同等である場合、上記の例で2つの構造の有用性を示すことのポイントは何ですか:

int cnt = 0;
do {
   cnt = streamR.read(512, buf).get();
   if (cnt == 0)
      break;
   cnt = streamW.write(cnt, buf).get();
} while (cnt > 0);

read().get()と呼び出しの両方write().get()が同期している場所は?

4

5 に答える 5

6

より完全な例 (うまくいけば正しい):

future<void> forwardMsgs(istream& streamR, ostream& streamW) async
{
    char buf[512];
    int cnt = 0;
    do {
       cnt = await streamR.read(512, buf);
       if (cnt == 0)
          break;
       cnt = await streamW.write(cnt, buf);
    } while (cnt > 0);
}

future<void> fut = forwardMsgs(myStreamR, myStreamW);

/* do something */

fut.get();

重要な点は次のとおりです (ドラフトからの引用):

中断後、再開可能な関数は、ランタイムのスケジューリング ロジックによって再開される可能性があり、最終的にそのロジックを完了します。その時点で、return ステートメント (明示的または暗黙的) を実行し、関数の結果値をプレースホルダーに設定します。

と:

再開可能な関数は、実行の中断に続いて再開した後、別のスレッドで実行を継続できます。

つまり、最初に呼び出したスレッドは、任意の中断ポイントで戻るforwardMsgs ことができます。その場合、関数が「同期的に」呼び出されたとしても/* do something */、行中にコード内のコードが別のスレッドによって実行されるforwardMsgs 可能性があります。


この例は、

future<void> fut = std::async(forwardMsgs, myStreamR, myStreamW);

/* do something */

fut.get();

違いは、再開可能な関数を異なるスレッドで実行できることです。異なるスレッドは、各再開/一時停止ポイントの後で (再開可能な関数の) 実行を再開できます。

于 2013-08-20T08:29:57.827 に答える