Date: Fri, 08 May 2020 19:45:41 -0700
On Friday, 8 May 2020 18:02:59 PDT connor horman via Std-Proposals wrote:
> Currently in the C++ language, it is undefined behaviour to have an
> infinite loop without observable side effects. While this is nice on paper,
> it has a few issues. Any time you need to loop forever, you basically need
> to insert a (potentially costly) side effect.
Any time? How often do you need to do that? The only case I can think of is of
an OS that has finished running and doesn't know how to turn the device off.
Can you give an example different from the above?
> A further case would be an init process on linux, which cannot terminate
> (doing so results in a kernel panic), nor can just call hlt in a loop, as
> that's one way to get a #GP which probably translates to SIGILL.
It should call reboot(2). This is not a valid example.
> Once an
> init process is done setting up, it could want to just spin forever, and do
> so using as little system resources as possible. The logical idea would be
> just for(;;) std::this_thread::yield();, but that would be UB as yield() is
> not observable (correct me if I'm wrong).
It can use less resources by calling a function that will sleep forever, like
poll() with no timeout and no file descriptors. In any case, I don't know for
sure, but I think yield() counts as observable side-effect.
> Having the ability to spin forever, without wasting time actually doing
> stuff, seems like a reasonable thing to have in low-level code
Yes, in low-level code. Assembly.
> Currently in the C++ language, it is undefined behaviour to have an
> infinite loop without observable side effects. While this is nice on paper,
> it has a few issues. Any time you need to loop forever, you basically need
> to insert a (potentially costly) side effect.
Any time? How often do you need to do that? The only case I can think of is of
an OS that has finished running and doesn't know how to turn the device off.
Can you give an example different from the above?
> A further case would be an init process on linux, which cannot terminate
> (doing so results in a kernel panic), nor can just call hlt in a loop, as
> that's one way to get a #GP which probably translates to SIGILL.
It should call reboot(2). This is not a valid example.
> Once an
> init process is done setting up, it could want to just spin forever, and do
> so using as little system resources as possible. The logical idea would be
> just for(;;) std::this_thread::yield();, but that would be UB as yield() is
> not observable (correct me if I'm wrong).
It can use less resources by calling a function that will sleep forever, like
poll() with no timeout and no file descriptors. In any case, I don't know for
sure, but I think yield() counts as observable side-effect.
> Having the ability to spin forever, without wasting time actually doing
> stuff, seems like a reasonable thing to have in low-level code
Yes, in low-level code. Assembly.
-- Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org Software Architect - Intel System Software Products
Received on 2020-05-08 21:48:45