Задействовать сигналы для связи между потоками кажется избыточным. В этом случае я бы использовал ожидание на condition variable.
condition_variable::wait
и condition_variable::notify_one
работают? Да даже этот интерфейс изоморфен WaitForSingleObject/SetEvent.
Конкретно в этом примере использование атомиков в сочетании с yieldом для синхронизации потоков будет самым дешевым, на мой взгляд
Ничего вы не срезали. А всего-лишь чуть-чуть поменяли порядок перебора все тех же пар чисел, сильно усложнив код.