When the SIGINT is sent to your process, it is delivered to the only thread that has it unblocked, your Ctrl_C_handler
thread. Signal delivery means taking whatever action is associated with the signal, and the default action for SIGINT is, as you know, process termination.
But why doesn't sigwait() calmly intercept the signal, as you intend?
sigwait() is designed to remove a signal from a mask of pending signals — that is, generated signals whose delivery is suspended (SIG_BLOCKed) — without the usual asynchronous drama of signal delivery.
So, don't SIG_UNBLOCK SIGINT in your thread. Instead, keep it blocked and the code will work as you intend. If you scrutinize the reference you provided, you'll see that that sample code blocks all signals before calling sigwait().