Поскольку вы упоминаете об использовании epoll, вы должны использовать Linux. Это означает, что вы можете использовать eventfd()
.
По сути, ваша функция post_task
создает новый дескриптор eventfd для каждого потока, а основной поток отслеживает его на читаемость в epoll. Затем поток записывает 64-битное целое число в свой дескриптор, когда это будет сделано. Затем основной поток выходит из epoll, видит, что событие доступно для чтения, считывает из него 64-битное целое число и делает все, что ему нужно сделать сейчас, когда он знает, что связанный поток выполнен с задачей. (В системах, отличных от Linux, вы можете получить аналогичный эффект, используя pipe()
; я написал код с функцией создания события, которая переключается между ними в зависимости от целевой ОС)
Если вам нужно передать больше информации, чем просто состояние «Я закончил», мне нравится использовать сокет дейтаграмм домена Unix, созданный с помощью socketpair()
, и структуры чтения / записи со всеми необходимыми данными. Если вы включите идентификатор потока, все потоки могут даже использовать один и тот же сокет.