Я понимаю, что вы хотите избежать использования ядра, чтобы избежать накладных расходов, связанных с ядром. Большинство таких издержек связано с переключением контекста. Вот демонстрация одного способа выполнить то, что вам нужно, используя сигналы без вращения и без переключения контекста:
#include <signal.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <pthread.h>
#include <iostream>
#include <thread>
using namespace std;
void sigRtHandler(int sig) {
cout << "Recevied signal" << endl;
}
int main() {
constexpr static int kIter = 100000;
thread t([]() {
signal(SIGRTMIN, sigRtHandler);
for (int i = 0; i < kIter; ++i) {
usleep(1000);
}
cout << "Done" << endl;
});
usleep(1000); // Give child time to setup signal handler.
auto handle = t.native_handle();
for (int i = 0; i < kIter; ++i)
pthread_kill(handle, SIGRTMIN);
t.join();
return 0;
}
Если вы запустите этот код, вы увидите, что дочерний поток продолжает получать SIGRTMIN. Во время выполнения процесса, если вы посмотрите в файле / proc / (PID) / task / * / status для этого процесса, вы увидите, что родительский поток не вызывает переключение контекста из вызова pthread_kill ().
Преимущество этого подхода состоит в том, что ожидающий поток не должен вращаться. Если работа ожидающего потока не зависит от времени, этот подход позволяет вам сэкономить CPU.