Mehrere Threads lesen aus derselben Datei

Lesezeit: 5 Minuten

Benutzeravatar von anru
anru

Meine Plattform ist Windows Vista 32 mit Visual C++ Express 2008.

Zum Beispiel:

Wenn ich eine Datei habe, die 4000 Bytes enthält, kann ich 4 Threads gleichzeitig aus der Datei lesen lassen? und jeder Thread greift auf einen anderen Abschnitt der Datei zu.

Thread 1 liest 0–999, Thread 2 liest 1000–2999 usw.

Bitte geben Sie ein Beispiel in C-Sprache.

  • Klingt nach Hausaufgaben. Welche Threading-Bibliothek verwendest du? Wo bist du hängen geblieben?

    – dirkgent

    5. Mai 2009 um 5:33 Uhr

  • Keine Hausaufgabe, Alter, ich will nur wissen, ob es möglich ist oder nicht. Ich weiß nicht einmal, wie ich es machen soll, da die meisten auf Google veröffentlichten Lösungen nicht wie echte Parallelzugriffsdateien aussehen, verwenden sie alle Sperren

    – anru

    5. Mai 2009 um 5:39 Uhr

Benutzeravatar von Francis
Francis

Wenn Sie ihnen nicht schreiben, müssen Sie sich nicht um die Synchronisierungs- / Rennbedingungen kümmern.

Öffnen Sie einfach die Datei mit gemeinsamem Lesen als verschiedene Handles und alles würde funktionieren. (dh Sie müssen die Datei im Kontext des Threads öffnen, anstatt denselben Datei-Handle gemeinsam zu nutzen).

#include <stdio.h>
#include <windows.h>

DWORD WINAPI mythread(LPVOID param)
{
    int i = (int) param;
    BYTE buf[1000];
    DWORD numread;

    HANDLE h = CreateFile("c:\\test.txt", GENERIC_READ, FILE_SHARE_READ,
        NULL, OPEN_EXISTING, 0, NULL);

    SetFilePointer(h, i * 1000, NULL, FILE_BEGIN);
    ReadFile(h, buf, sizeof(buf), &numread, NULL); 
    printf("buf[%d]: %02X %02X %02X\n", i+1, buf[0], buf[1], buf[2]);

    return 0;
}

int main()
{
    int i;
    HANDLE h[4];

    for (i = 0; i < 4; i++)
        h[i] = CreateThread(NULL, 0, mythread, (LPVOID)i, 0, NULL);

    // for (i = 0; i < 4; i++) WaitForSingleObject(h[i], INFINITE);
    WaitForMultipleObjects(4, h, TRUE, INFINITE);

    return 0;
}

  • Die Schleife mit WaitForSingleObject() sollte durch einen einzelnen WaitForMultipleObjects()-Aufruf ersetzt werden. Ansonsten ist es +1.

    – mghie

    8. Mai 2009 um 17:08 Uhr

Es gibt nicht einmal ein großes Problem Schreiben in der gleichen Datei, in aller Ehrlichkeit.

Der bei weitem einfachste Weg ist, die Datei einfach im Speicher abzubilden. Das Betriebssystem gibt Ihnen dann eine Lücke*, wo die Datei in den Speicher abgebildet wird. Wirf das auf einen Char[]und stellen Sie sicher, dass jeder Thread nicht überlappende Subarrays verwendet.

void foo(char* begin, char*end) { /* .... */ }
void* base_address = myOS_memory_map("example.binary");
myOS_start_thread(&foo, (char*)base_address, (char*)base_address + 1000);
myOS_start_thread(&foo, (char*)base_address+1000, (char*)base_address + 2000);
myOS_start_thread(&foo, (char*)base_address+2000, (char*)base_address + 3000);

  • Was sind das für Funktionen, die Sie verwenden? myOS_start_thread und myOS_memory_map? Ich kann diese in C-Sprache nicht finden? und bitte erklären Sie Ihre Antwort auf einfachere Weise? Danke

    Benutzer2603796

    1. Dezember 2014 um 18:34 Uhr

  • @FarazAhmad: Das liegt daran, dass sie absichtlich falsche Namen sind. Ersetzen Sie durch das, was Ihr Betriebssystem verwendet. Außerdem ist die Antwort älter als C ++ 11, sodass ich sie nicht verwenden konnte std::thread.

    – MSalter

    2. Dezember 2014 um 12:47 Uhr

Wie andere bereits angemerkt haben, gibt es kein inhärentes Problem, wenn mehrere Threads aus derselben Datei lesen, solange sie ihre eigenen Dateideskriptoren/Handles haben. Allerdings bin ich etwas neugierig auf deine Motive. Warum wollen Sie eine Datei parallel lesen? Wenn Sie nur eine Datei in den Speicher lesen, ist Ihr Engpass wahrscheinlich die Festplatte selbst, in diesem Fall helfen Ihnen mehrere Threads überhaupt nicht (es wird nur Ihren Code überladen).

Und wie immer beim Optimieren sollten Sie es nicht versuchen, bis Sie (1) eine leicht verständliche, funktionierende Lösung haben und (2) Ihren Code gemessen haben, um zu wissen, wo Sie optimieren sollten.

Windows unterstützt überlappende E/A, wodurch ein einzelner Thread mehrere E/A-Anforderungen für eine bessere Leistung asynchron in die Warteschlange stellen kann. Dies könnte möglicherweise von mehreren Threads gleichzeitig verwendet werden, solange die Datei, auf die Sie zugreifen, die Suche unterstützt (dh dies ist keine Pipe).

Vorbeigehen FILE_FLAG_OVERLAPPED Zu CreateFile() ermöglicht gleichzeitiges Lesen und Schreiben auf demselben Datei-Handle; andernfalls werden sie von Windows serialisiert. Geben Sie den Datei-Offset mithilfe von an Offset Und OffsetHigh Mitglieder von OVERLAPPED Struktur.

Weitere Informationen finden Sie unter Synchronisation und überlappende Eingabe und Ausgabe.

Sie können sicherlich mehrere Threads haben, die aus einer Datenstruktur lesen, es können möglicherweise Racebedingungen auftreten, falls vorhanden Schreiben findet statt.

Um solche Racebedingungen zu vermeiden, müssen Sie die Grenzen definieren, die Threads lesen können, wenn Sie eine explizite Anzahl von Datensegmenten und eine explizite Anzahl von Threads haben, um diese abzugleichen, dann ist das einfach.

Für ein Beispiel in C müssten Sie einige weitere Informationen angeben, z. B. die von Ihnen verwendete Threading-Bibliothek. Versuchen Sie es zuerst, dann können wir Ihnen bei der Behebung von Problemen helfen.

  • Ich habe das Programm noch nicht geschrieben, aber ich werde es mit pthread versuchen, da ich einige pthread-Jobs unter Linux durchgeführt habe. Das Programm schreibt nichts, muss nur aus der Datei lesen.

    – anru

    5. Mai 2009 um 5:41 Uhr

Benutzeravatar von user665049
Benutzer665049

Am einfachsten ist es, die Datei in jeder parallelen Instanz zu öffnen, aber öffnen Sie sie einfach als schreibgeschützt.

Die Leute, die sagen, dass es einen IO-Engpass geben könnte, liegen wahrscheinlich falsch. Jedes moderne Betriebssystem speichert Dateilesevorgänge im Cache. Das bedeutet, dass das erste Mal, wenn Sie eine Datei lesen, am langsamsten ist und alle nachfolgenden Lesevorgänge blitzschnell sind. Eine 4000-Byte-Datei kann sogar im Cache des Prozessors verbleiben.

  • Ich habe das Programm noch nicht geschrieben, aber ich werde es mit pthread versuchen, da ich einige pthread-Jobs unter Linux durchgeführt habe. Das Programm schreibt nichts, muss nur aus der Datei lesen.

    – anru

    5. Mai 2009 um 5:41 Uhr

Benutzeravatar von Martin York
Martin York

Einen wirklichen Vorteil sehe ich darin nicht.
Möglicherweise haben Sie mehrere Threads, die vom Gerät lesen, aber Ihr Engpass ist nicht die CPU-, sondern die E/A-Geschwindigkeit der Festplatte.

Wenn Sie nicht aufpassen, können Sie die Prozesse sogar verlangsamen (aber Sie müssen es messen, um es sicher zu wissen).

  • Wenn er einen guten Raid oder eine SSD hat, ist das vielleicht nicht so schlimm, aber ein guter Punkt. +1

    – Ben Collins

    9. Mai 2009 um 2:23 Uhr

  • Guter Punkt, aber dies wäre besonders nützlich, wenn die Verarbeitungskosten einer Zeile die Kosten des Festplattenzugriffs übersteigen …

    – Raghav RV

    3. November 2016 um 14:40 Uhr

1444020cookie-checkMehrere Threads lesen aus derselben Datei

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

Privacy policy