но IOCP и например epoll отличаются настолько сильно, что их почти невозможно объединить общей высокоуровневой абстракцией
int (*pointer3d)[dim2][dim3];
int (*pointer2d)[dim3];
Но вообще ожидался результат:
с точки зрения применения экранирования(!) могло бы выглядеть вот так
На мой взгляд, файловые операции реализуют на потоках из-за того, что количество файловых операций в том же libuv гораздо больше, чем открытие/чтение/запись/закрытие.
Получается что либо мы ограничиваем файловый i/o стандартным набором операций (чего явно не достаточно), либо натягиваем весь расширенный интерфейс файловых операций на остальной i/o, который там нафиг не нужен.