Threading in C, plattformübergreifend

Lesezeit: 5 Minuten

Ich beschäftige mich mit einem bestehenden Projekt (in C), das derzeit auf einem einzigen Thread ausgeführt wird, und wir möchten auf mehreren Plattformen laufen UND mehrere Threads haben. Hoffentlich gibt es dafür eine Bibliothek, denn meiner Meinung nach ist die Win32-API so, als würde man sich wiederholt ins Auge stechen. Ich kenne Boost.Thread für C++, aber das muss C sein (und auf MinGW und gcc kompilierbar). Cygwin ist keine Option, tut mir leid.

  • Wenn du das denkst CreateThread sich wiederholt in die Augen sticht, sollten Sie dies nicht versuchen.

    – asveikau

    10. April 2011 um 18:59 Uhr

Benutzeravatar von Cacho Santa
Cache Santa

Versuchen OpenMP API, es ist plattformübergreifend und Sie können es mit GCC kompilieren.

Kurzbeschreibung aus der Wikipedia:

OpenMP (Open Multi-Processing) ist eine Anwendungsprogrammierschnittstelle (API), die plattformübergreifende Shared-Memory-Multiprocessing-Programmierung in C, C++ und Fortran unterstützt.[3] auf den meisten Plattformen, Prozessorarchitekturen und Betriebssystemen, einschließlich Solaris, AIX, HP-UX, Linux, macOS und Windows. Es besteht aus einer Reihe von Compiler-Direktiven, Bibliotheksroutinen und Umgebungsvariablen, die das Laufzeitverhalten beeinflussen.

  • Nach über einem Jahr mit OpenMP kann ich jedem, der diese Frage liest, versichern, dass sich die Zeit zu 100 % gelohnt hat.

    – Dhaivat Pandya

    5. August 2012 um 20:44 Uhr

  • Defekter Link, versucht zu bearbeiten, aber die Seite sagt, ich sollte mindestens 6 Zeichen bearbeiten …

    – RP.

    18. Januar 2017 um 7:47 Uhr

Benutzeravatar von paperjam
Papierstau

Ich würde die POSIX-Thread-API verwenden – pthread. Dieser Artikel enthält einige Hinweise zur Implementierung unter Windows und einen Download nur für Header-Dateien (BSD-Lizenz):

http://locklessinc.com/articles/pthreads_on_windows/

Bearbeiten: Ich habe das sourceforge pthreads-win32-Projekt in der Vergangenheit für Multi-Plattform-Threading verwendet und es hat wirklich gut funktioniert. Die Dinge haben sich seitdem weiterentwickelt und der obige Link scheint aktueller zu sein, obwohl ich ihn nicht ausprobiert habe. Diese Antwort setzt natürlich voraus, dass pthreads auf Ihren Nicht-Windows-Zielen verfügbar sind (für Mac / Linux sollte ich denken, dass sie wahrscheinlich sogar eingebettet sind).

  • Ich würde damit gehen, also +1.

    – Martin Jakob

    6. März 2013 um 17:40 Uhr

Benutzeravatar von Olof Forshell
Olof Forshell

Windows-Threading hat im Vergleich zu Linux ausreichend unterschiedliche Funktionen, sodass Sie vielleicht zwei verschiedene Implementierungen in Betracht ziehen sollten, zumindest wenn die Anwendungsleistung ein Problem darstellen könnte. Andererseits kann die einfache Implementierung von Multi-Threading Ihre App langsamer machen als zuvor. Nehmen wir an, dass die Leistung ein Problem ist und dass Multi-Threading die beste Option ist.

Bei Windows-Threads denke ich speziell an I/O Completion Ports (IOCPs), die die Implementierung von I/O-ereignisgesteuerten Threads ermöglichen, die die Hardware am effizientesten nutzen.

Viele “klassische” Anwendungen sind nach dem Konzept eines Threads/eines Sockets (/ein Benutzer oder ähnliches) aufgebaut, wobei die Anzahl gleichzeitiger Sitzungen durch die Fähigkeit des Planers begrenzt wird, eine große Anzahl von Threads (> 1000) zu handhaben. Das IOCP-Konzept ermöglicht es, die Anzahl der Threads auf die Anzahl der Kerne in Ihrem System zu begrenzen, was bedeutet, dass der Scheduler sehr wenig zu tun hat. Die Threads werden nur ausgeführt, wenn das IOCP sie freigibt, nachdem ein E/A-Ereignis aufgetreten ist. Der Thread bedient den IOC, initiiert (typischerweise) eine neue E/A und kehrt zurück, um am IOCP auf den nächsten Abschluss zu warten. Vor dem Freigeben eines Threads stellt der IOCP auch den Kontext der Vervollständigung bereit, so dass der Thread “weiß”, zu welchem ​​Verarbeitungskontext der IOC gehört.

Das IOCP-Konzept beseitigt das Abfragen vollständig, das eine große Ressourcenverschwendung darstellt, obwohl das Abfragen “Warten auf mehrere Objekte” eine gewisse Verbesserung darstellt. Das letzte Mal, als ich nachgesehen habe, hatte Linux nichts im Entferntesten wie IOCPs, sodass eine Linux-Multithread-Anwendung ganz anders aufgebaut wäre als eine Windows-App mit IOCPs.

Bei wirklich effizienten IOCP-Apps besteht die Gefahr, dass so viele IOs (bzw. Umgekehrt besteht bei wirklich ineffizienten IOCP-Apps die Gefahr, dass so viele Inputs in die Warteschlange gestellt werden (darauf warten, bedient zu werden), dass der nicht ausgelagerte Speicher erschöpft ist, wenn versucht wird, sie vorübergehend zu puffern.

Benutzeravatar von Alexander Saprykin
Alexander Saprikin

Wenn jemand eine tragbare und leichte Lösung zum Einfädeln in C benötigt, werfen Sie einen Blick auf die plibsys Bibliothek. Es bietet Ihnen Thread-Management und -Synchronisierung sowie andere nützliche Funktionen wie die Implementierung von Portable Sockets. Alle wichtigen Betriebssysteme (Windows, Linux, OS X) werden unterstützt, verschiedene andere, weniger verbreitete Betriebssysteme werden ebenfalls unterstützt (z. B. AIX, HP-UX, Solaris, QNX, IRIX usw.). Auf jeder Plattform werden nur die nativen Aufrufe verwendet, um den Overhead zu minimieren. Die Bibliothek ist vollständig mit Einheitentests abgedeckt, die regelmäßig ausgeführt werden.

glatte Threads können plattformübergreifend zusammengestellt werden.

  • Nie wieder werde ich einen Objekt-Wrapper für C verwenden. Ich bin fertig mit Glib, tut mir leid.

    – Dhaivat Pandya

    4. Juli 2011 um 6:43 Uhr

  • Es wird überall verwendet. Was war dein Problem?

    – Manuel Salvadores

    5. Juli 2011 um 7:17 Uhr

Benutzeravatar von rubenvb
rubenvb

Die “beste”https://stackoverflow.com/”simplest”/… Antwort hier ist definitiv pthreads. Es ist die native Threading-Architektur auf Unix/POSIX-Systemen und funktioniert fast genauso gut auf Windows. Sie müssen nicht weiter suchen.

  • Nie wieder werde ich einen Objekt-Wrapper für C verwenden. Ich bin fertig mit Glib, tut mir leid.

    – Dhaivat Pandya

    4. Juli 2011 um 6:43 Uhr

  • Es wird überall verwendet. Was war dein Problem?

    – Manuel Salvadores

    5. Juli 2011 um 7:17 Uhr

Benutzeravatar von Liam Marshall
Liam Marshall

Da Sie mit C eingeschränkt sind, habe ich zwei Vorschläge:

1) Ich habe ein Projekt (ähnlich wie Ihres) gesehen, das unter Windows und Linux mit Threads laufen musste. Die Art und Weise, wie es geschrieben wurde, war, dass es (die gleiche Codebasis) pthreads unter Linux und win32-Threads unter Windows verwendete. Dies wurde durch eine bedingte #ifdef-Anweisung erreicht, wo immer Threads erstellt werden mussten, wie z

#ifdef WIN32

//use win32 threads

#else

//use pthreads

#endif

2) Der zweite Vorschlag könnte sein, OpenMP zu verwenden. Hast du überhaupt an OpenMP gedacht?

Bitte lassen Sie mich wissen, wenn ich etwas verpasst habe oder wenn Sie weitere Informationen wünschen. Ich helfe gern.

Beste Krishna

  • Wenn ich das wollte, hätte ich nicht nach der Bibliothek gefragt, da ich sagte, ich wollte etwas, das die Win32-API nicht verwendet.

    – Dhaivat Pandya

    14. April 2011 um 23:54 Uhr

1437450cookie-checkThreading in C, plattformübergreifend

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy