Я так понимаю нужен либо tun либо tup адаптер, или оба?
я сторонню библиотеку указал в Additional include Directories
По какой логике надо искать ?
S1 s1 = (S1){1, 1};
printf("A: %d, B: %d", s1);
стоит учесть внутреннюю реализацию функции range?
Попытался убрать return у GetLastError, однако ничего также не изменилось
// формируем командную строку
printf(lpszComLine, ...);
В этом случае я бы использовал ожидание на condition variable.
Так же можно использовать барьеры (std::barrier в С++20 или pthread_barrier) - собственно барьеры "специализированы" на синхронизации потоков. Барьеры, скорее всего, сделаны на мьютексах и condvarах, не то чтобы это какой-то отдельный примитив синхронизации - просто готовая реализация для частного случая.
Если задача только в синхронизации потоков, то атомики не нужны.
Конкретно в этом примере использование атомиков в сочетании с yieldом для синхронизации потоков будет самым дешевым, на мой взгляд. В других более реальных случаях, там где ожидание может быть хоть сколько-нибудь продолжительным, стоит использовать что-то другое (барьеры или condvar).