What is the issue with std::async?

后端 未结 2 436
耶瑟儿~
耶瑟儿~ 2020-12-30 02:30

Near the beginning of this clip from C++ And Beyond, I heard something about problems with std::async. I have two questions:

  1. For a junior devel

2条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-30 03:02

    I could not disagree more about the advice to use the default policy.

    If you go through the pain of designing independent computation units, you probably don't expect them to run sequentially while half a dozen CPUs twiddle their thumbs, which can "legally" happen depending on the compiler you choose.

    The implicit assumption of the default behaviour is that some sophisticated thread pool mechanism will optimize task placement (possibly letting some run sequentially on the caller's CPU), but that is pure phantasy, since nothing specifies what the C++ runtime must do (which would go way beyond the scope of a compiler runtime anyway).

    This looks more like undefined behaviour by design to me.

    A class named "async" should launch asynchronous execution units, unless some explicit and deterministic behaviour parameter tells it otherwise.

    Frankly, except for debugging purpose, I can't see a use for launch::deferred, unless you plan on writing your own pseudo-scheduler, in which case you'll be better off using plain threads.

    So my advice would be to specify launch::async when you use async, (telling the compiler something like "hey, I want some async task, but really async, ok?") and not to use async at all if you just want to execute tasks sequentially.

    If you run into trouble with your async tasks, it can be convenient to revert to deferred policy to debug them more easily, but that's about it.

提交回复
热议问题