# PostTask のスレッド TaskRunnerについては何度か確認しているが、どのタスクがどの連スレッドで走るのか混乱したので再確認しようと思う。 ## PostTask [PostTask](https://source.chromium.org/chromium/chromium/src/+/main:base/task/task_runner.h;l=68;drc=41d53a863ef269e6d53fea38cc1d3feda6c3df78)は`task`を投げるだけ。 その本体は[PostDelayedTask](https://source.chromium.org/chromium/chromium/src/+/main:base/task/task_runner.h;l=73;drc=41d53a863ef269e6d53fea38cc1d3feda6c3df78)に合流するのでそちらを見ていく。 これはいろんな輩にOverrideされているので、一旦SequencedTaskRunnerを読む。 [PooledSequencedTaskRunner::PostDelayedTask](https://source.chromium.org/chromium/chromium/src/+/main:base/task/thread_pool/pooled_sequenced_task_runner.cc;l=25;drc=41d53a863ef269e6d53fea38cc1d3feda6c3df78)は`sequence`とともに[PostTaskWithSequence](https://source.chromium.org/chromium/chromium/src/+/main:base/task/thread_pool/thread_pool_impl.cc;l=470;drc=41d53a863ef269e6d53fea38cc1d3feda6c3df78)を流して、delayがなければ[ThreadPoolImpl::PostTaskWithSequenceNow](https://source.chromium.org/chromium/chromium/src/+/main:base/task/thread_pool/thread_pool_impl.cc;l=448;drc=41d53a863ef269e6d53fea38cc1d3feda6c3df78)を呼び出し、`sequence`のqueueに[PushImmediateTask](https://source.chromium.org/chromium/chromium/src/+/main:base/task/thread_pool/sequence.cc;l=79;drc=41d53a863ef269e6d53fea38cc1d3feda6c3df78)する。 このqueueにあるTaskはThreadPoolのスレッドで走ることになる。 ## PostTaskAndReply [PostTaskAndReply](https://source.chromium.org/chromium/chromium/src/+/main:base/task/task_runner.h;l=121;drc=915d2556484c2d799cdc79d3df0a312834a04482)とは、`task`を投げて完了してから`reply`を走らせる関数。 ```cpp= bool PostTaskAndReply(const Location& from_here, OnceClosure task, OnceClosure reply); ``` ここでは`task`と`reply`の2つのコールバックが登場する。 ```cpp= const bool post_task_success = task_poster( from_here, BindOnce(&PostTaskAndReplyRelay::RunTaskAndPostReply, PostTaskAndReplyRelay( from_here, std::move(task), std::move(reply), has_sequenced_context ? SequencedTaskRunner::GetCurrentDefault() : nullptr))); // ここでTaskPosterは以下の型 [this](const Location& location, OnceClosure task) { return PostTask(location, std::move(task)); } ``` PostTask以降は前のセクションと同じ。 では`task`のほうがどう扱われるかと言うと、[RunTaskAndPostReply](https://source.chromium.org/chromium/chromium/src/+/main:base/threading/post_task_and_reply_impl.h;l=43;drc=41d53a863ef269e6d53fea38cc1d3feda6c3df78)によって`std::move(relay.task_).Run();`が呼ばれ、この`task_`に`TaskPoster`に`task`がバインドされたものが代入されている。 つまり`task`はPostTaskと同様ThreadPoolのスレッドで走ることになる。 一方`reply`の方は、[RunReply](https://source.chromium.org/chromium/chromium/src/+/main:base/threading/post_task_and_reply_impl.h;l=60;drc=41d53a863ef269e6d53fea38cc1d3feda6c3df78)から呼ばれており、PostTaskAndReplyが呼ばれたsequenceで呼ばれる。 つまりオリジナルスレッドで呼ばれる。 ## まとめ PostTaskはあっちがわ、Replyはこっちがわで走る。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up