Это зависит от 2 вещей - вашей кодовой базы и вашего места в ней. Ключевыми вопросами являются: 1) «Есть ли в вашей базе кода потоки, пулы потоков и управляющие примитивы (блокировки, события и т. Д.)» И 2) «Вы разрабатываете библиотеки многократного использования или обычные приложения?»
Если в вашей библиотеке есть инструменты для работы с потоками (почти всегда основанные на какой-то разновидности PThread), используйте их. Если вы разработчик библиотеки, потратьте время (если возможно) на их создание. Это того стоит - вы можете собрать гораздо более тонкую, расширенную многопоточность, чем даст вам OpenMP.
И наоборот, если вам не хватает времени или вы просто разрабатываете приложения или что-то из сторонних инструментов, используйте OpenMP. Вы можете заключить его в несколько макросов и получить базовый параллелизм, который вам нужен.
В общем, OpenMP достаточно хорош для базовой многопоточности. Как только вы начнете понимать, что вы управляете системой, получающей ресурсы непосредственно на создание высоко асинхронного кода, ее простота использования сводится на нет из-за проблем с производительностью и интерфейсом.