2016-04-07 27 views
-1

Ein bereitgestelltes Framework ruft meine Funktion PartialCodec.Unterscheiden zwischen Threads, die von Pthread aufgerufen werden

pthread_create(&(pcPthread[iTd]),NULL,PartialCodec,(void *)&pcMCData[iTd]); 

Ich darf den Rahmencode nicht ändern. Innerhalb von PartialCodec möchte ich jedoch verschiedene Aufgaben für verschiedene Threads zuweisen und so muss ich zwischen jedem Thread unterscheiden. Wie kann ich das machen?

+0

Hier ist kein Geheimnis. Sie haben zwei einfache Möglichkeiten, um zu bestimmen, was der Thread macht: Erstens bestimmt das 'void * (*) (void *)' - Argument, welche Funktion der Thread startet, Two bestimmt das 'void *', was das Argument für diese Funktion ist wird sein. – EOF

+0

Jeder Thread geht automatisch zur PartialCodec-Funktion und das Argument ist für alle Threads gleich –

+1

Sie zeigen nicht Ihren gesamten Code, aber wir nehmen an, dass 'iTd' für jeden Thread anders ist, was bedeuten sollte, dass jeder Thread einen anderen Zeiger bekommt zu einem Element von 'pcMCData'. – jxh

Antwort

0

Verwenden Sie das Argument, Luke.

Sie übergeben &pcMCData[iTd] als Thread-Argument.

Fügen Sie einfach einige Felder zu dieser Struktur hinzu und teilen Sie dem Thread mit, an welchen Aufgaben gearbeitet werden soll. (Und setzen offensichtlich die Felder vor den Faden zu schaffen)

pcMCData[iTd].thingToWorkOn = /* however you decide the thing to work on */; 
pthread_create(&(pcPthread[iTd],NULL,PartialCodec,(void *)&pcMCData[iTd]); 
+0

Dies ist eigentlich Teil meines Projekts und ich habe eine Reihe von Code zur Verfügung gestellt, die ich nicht ändern sollte. Ich kann nur innerhalb der PartialCodec-Funktion schreiben. –

+0

Also, es ist vielleicht genauer zu sagen, "jemand anderes startet Threads mit' pthread_create() '..." –

+0

Ja, mein Professor hat den Code zum Starten von Threads geschrieben und ich soll ihn nicht ändern. –

1

Angenommen, Sie wissen, wie viele Threads PartialCodec Aufruf werden Sie static Variablen innerhalb der Funktion können Sie die Kommunikation zwischen Threads erleichtern. Ein blankes static würde es allen Threads in PartialCodec ermöglichen, dieselbe Objektinstanz zu bearbeiten.

void * PartialCodec (void *arg) { 
    static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 
    static struct state { 
     /* some state */ 
    } critical; 
    struct state local; 

    pthread_mutex_lock(&lock); 
    local = critical; /* make a local copy */ 
    /* update critical */ 
    pthread_mutex_unlock(&lock); 

    /* ... refer to local copy of state ... */ 
} 

Die critical Zustand Spuren, welche einen Teil des Problems einen bestimmten Thread lösen sollte. Kopieren nach local stellt fest, dass der Thread für diesen Teil des Problems funktioniert. Der Status critical wird dann aktualisiert, sodass der nächste Thread, der critical liest, weiß, dass er an einem anderen Teil des Problems arbeitet.

Verwandte Themen