— Первый вызывает epoll в бесконечном цикле и записывает события в shared memory queue
— Второй в бесконечном цикле читает события из shared memory queue и пишет в консоль или файл.
Всё. Мьютекс не нужен, shared memory queue реализуется с помощью атомиков.