Cela dépend de deux choses : votre base de code et votre place dans cette base. Les questions clés sont les suivantes : 1) "Votre base de code comporte-t-elle des threads, des threadpools et des primitives de contrôle (verrous, événements, etc.) ?" et 2) "Développez-vous des bibliothèques réutilisables ou des applications ordinaires ?".
Si votre bibliothèque dispose d'outils pour les threads (presque toujours construits sur une certaine forme de PThread), UTILISEZ-LES. Si vous êtes un développeur de bibliothèque, prenez le temps (si possible) de les construire. Cela en vaut la peine - vous pouvez mettre en place un threading beaucoup plus fin et avancé que ce que vous offre OpenMP.
À l'inverse, si vous êtes pressé par le temps ou si vous développez simplement des applications ou quelque chose à partir d'outils tiers, utilisez OpenMP. Vous pouvez l'envelopper dans quelques macros et obtenir le parallélisme de base dont vous avez besoin.
En général, OpenMP est suffisamment bon pour le multithreading de base. Dès que l'on arrive à un point où l'on gère directement les ressources du système pour construire du code hautement asynchrone, son avantage en termes de facilité d'utilisation est supplanté par les problèmes de performance et d'interface.