Es hängt von 2 Dingen ab - Ihrer Code-Basis und Ihrem Platz darin. Die wichtigsten Fragen sind: 1) "Haben Sie Code-Basis haben Threads, Threadpools und die Steuerelemente (Sperren, Ereignisse, etc.)" und 2) "Entwickeln Sie wiederverwendbare Bibliotheken oder normale Anwendungen?"
Wenn Ihre Bibliothek Thread-Tools hat (fast immer mit einem gewissen Geschmack von PThread), VERWENDEN SIE DIESE. Wenn Sie ein Bibliotheksentwickler sind, verbringen Sie die Zeit (wenn möglich), um sie zu erstellen.Es lohnt sich - Sie können viel feinkörnigeres, fortschrittlicheres Threading zusammenstellen, als OpenMP Ihnen bietet.
Umgekehrt, wenn Sie auf Zeit gedrückt werden oder nur Apps oder etwas von Drittanbieter-Tools entwickeln, verwenden Sie OpenMP. Sie können es in ein paar Makros verpacken und erhalten die grundlegende Parallelität, die Sie brauchen.
Im Allgemeinen ist OpenMP gut genug für einfaches Multithreading. Sobald Sie an den Punkt kommen, an dem Sie Systemressourcen direkt beim Erstellen von hoch asynchronem Code verwalten, wird der Benutzerfreundlichkeitsvorteil durch Leistungs- und Schnittstellenprobleme verdrängt.
Re: Ihre Bearbeitung (Kernel-oder User-Level?) - Es kommt auf die Implementierung an! Eine API ist nur das - eine ** Schnittstelle **. OpenMP ist nicht die Implementierung - [aber das sind einige Implementierungen] (http://en.wikipedia.org/wiki/OpenMP#Implementations). (Es gibt auch ein paar Informationen in [diesem Wikipedia-Artikel] (http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library)). –
Wenn Sie in OpenMP das tun können, was Sie brauchen, sollten Sie es in OpenMP machen. –
OpenMP sollte für Schleifen verwendet werden, die auf allen Kernen berechnet werden müssen. PThread kann das auch, aber das ist eine Menge Arbeit und es ist sehr schwer zu warten, Sie verwenden PThread normalerweise, wenn Sie einen separaten Prozess starten müssen, der den Hauptthread nicht blockieren sollte. Zum Beispiel: Sie haben einen Server, Clients verbinden und müssen die Verbindung mit dem Server halten und sprechen, Sie erstellen einen Thread pro Client und arbeiten mit dem Client in diesem Thread, ohne den Haupt-Thread zu blockieren. Sie erstellen eine neue Anwendung und lassen sie auf dem Betriebssystem laufen, ohne die Hauptanwendung zu belästigen. –