Wie, um sicherzustellen, dass std::thread erstellt werden in multi-core?

Ich bin mit visual studio 2012. Ich habe ein Modul, wo ich gelesen haben, eine riesige Menge von Dateien von der Festplatte nach der Durchquerung Ihre entsprechenden Pfade über eine xml. Für diese mache ich

std::vector<std::thread> m_ThreadList;

In einer while-Schleife drück ich mich wieder in einem neuen thread in diesem Vektor, so etwas wie

m_ThreadList.push_back(std::thread(&MyClass::Readfile, &MyClassObject, filepath,std::ref(polygon)));

Mein C++11 multi-threading wissen ist begrenzt.Die Frage, die ich hier habe , ist , wie Sie tun, erstellen Sie einen thread auf, eine bestimmte Kern ? Ich weiß von parallel_for und parallel_for_each in vs2012, dass eine optimale Nutzung der Kerne. Aber, gibt es eine Möglichkeit, dies zu tun mit standard C++11?

  • Die C++ - thread-Funktionen haben keine Kenntnis von "cores", und daher können Sie nicht binden eines Threads an einen bestimmten Kern.
  • Ich weiß wirklich nicht, aber ich vermute, SetThreadAffinityMask und das handle zurückgegeben von std::thread::native_handle() vielleicht werden die nächsten, die Sie bekommen können. (Aber ich Stimme zu, dass es keine Möglichkeit gibt, dies zu tun, rein in den C++11 Standard, d.h. ohne Plattform-spezifische Aufrufe.)
  • Und als allgemeiner Tipp, wenn du mehrere threads zum Lesen aus mehreren Dateien, die auf dem gleichen Dateisystem, werden Sie wahrscheinlich machen das Programm langsamer durch das Betriebssystem haben zu suchen hin und her und jedes mal gibt es einen thread-context-switch. (Zumindest auf den alten mechanischen Festplatten, moderne SSDs umgehen sollten dies besser.)
  • Meinst du das wirklich eine "spezifische " core"? Wie "ich möchte, dass dieser thread speziell auf core #2"?
  • Drew Dormann :: ich haben vier Kerne, im Idealfall möchte ich die threads erstellt werden, die core, die weniger benutzt
  • wenn Sie möchten, um Sie zu verwalten, suchen, um für "thread-Affinität"
  • Joachim Pileborg :: Was ist der effizienteste Weg, den Sie vorschlagen, in diesem Fall ?
  • std::thread::hardware_concurrency die Ihnen helfen könnte.
  • Wenn es wirklich nur um "ich will nicht, dass meine 4 threads, um am Ende alle auf dem gleichen Kern". Dann ist die einfache Antwort ist "C' Mon, Sie verwenden ein Betriebssystem, das ist vollkommen bewusst, multi-core-Prozessoren und ist das nicht dumm". Aber wenn die Frage ist "will ich thread 2 ausgeführt werden, auf Kern 3" (gleich aus welchem Grund sollte dies notwendig sein auf einer multi-core in einem "normalen" Anwendung), dann sind Sie bis auf die Gnade des Plattform-abhängigen Funktionen.
  • Durch die Art und Weise, so dass, wenn Sie haben 100 Dateien, die Sie sind gonna start 100 threads? Viel Glück.
  • 'core, die weniger benutzt' werden, da diese ändern können, in einer unvorhersehbaren Art und Weise zu fast jeder Zeit, werden Sie ein problem haben. Lass es einfach auf das OS, wie andere vorgeschlagen haben.

InformationsquelleAutor Atul | 2013-04-04
Schreibe einen Kommentar