Inter-thread-Kommunikation. So senden Sie ein signal an einen anderen thread
In meiner Anwendung habe ich zwei threads
- eine "Haupt-thread" was beschäftigt die meisten der Zeit
- einem "zusätzlichen thread" die sendet einige HTTP-Anfrage und die Blöcke, bis es eine Antwort bekommt.
Jedoch, den HTTP-Antwort können nur behandelt werden, indem Sie den Haupt-thread, da es stützt sich auf thread-local-storage und nicht Thread-sichere Funktionen.
Ich bin auf der Suche nach ein Weg, zu sagen, der Haupt-thread, wenn eine HTTP-Antwort empfangen wurde, und die entsprechenden Daten. Der Haupt-thread sollte unterbrochen werden, indem der zusätzliche thread-und Prozess-den HTTP-Antwort so bald wie möglich, und danach arbeiten Sie weiter von dem Punkt, wo es unterbrochen wurde, bevor.
-
Einen Weg, woran ich denken kann ist, dass die zusätzlichen thread unterbricht den Haupt-thread mit
SuspendThread
, kopiert die TLS von den Haupt-thread mit einigen inline-assembler, führt die response-Verarbeitung-Funktion selbst auf und kehrt in den Haupt-thread danach. -
Einen anderen Weg, in meinen Gedanken ist, festlegen Sie einen Haltepunkt auf einige spezifische Adresse in dem zweiten threads callback-routine, so dass der Haupt-thread wird benachrichtigt, wenn das zweite Gewinde (instruction-pointer Schritte auf, die break-point - und-daher - erhalten hat, der HTTP-Antwort.
Jedoch, beide Methoden scheint das nicht zu schön an alle, Sie zu verletzen, wenn auch nur über Sie nachzudenken, und Sie sehen nicht wirklich zuverlässig.
Was kann ich verwenden, um interrupt meinem Haupt-thread, es zu sagen, dass es sein sollte höflich und verarbeiten der HTTP-Antwort, bevor Sie etwas anderes tun? Antworten ohne Abhängigkeiten von Bibliotheken sind geschätzt, aber ich würde auch etwas Abhängigkeit, wenn er bietet einige schöne Lösung.
Folgenden Frage (in Bezug auf die QueueUserAPC Lösung) wurde beantwortet und erklärt, dass es keine sichere Methode, um eine push-Verhalten in meinem Fall.
- Tun Sie wirklich brauchen, zu "unterbrechen" Ihre Haupt-thread? Wie ist die Verarbeitung sowieso, aus einer queue oder anderen arbeiten Mechanismus?
- Ja, eine Unterbrechung ist, was ich erreichen will in meinem Fall (in einigen "push"-Stil, Art und Weise. Nicht einige
Wait
oderLookIfThereIsSomething
oderPoll
"pull"-Stil-Ding). Die Verarbeitung Teil der HTTP-Antwort, die empfangen wurde von dem zweiten thread und ruft einige nicht Thread-sichere Funktionen zu einem Lua-interpreter danach. Das "WIE", um die Nachricht von dem zweiten thread der Haupt-thread könnte eine shared memory, allerdings ist diese noch nicht fest, da ich nicht weiß, wie der zweite thread Benachrichtigen der main-thread, sollte Prozess jetzt. - Was ist dein Haupt-thread zu tun? ist es unterbrochen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist möglicherweise eine jener Zeiten, wo man arbeitet sich in eine sehr konkrete Idee, ohne besinnung auf das größere Bild. Es gibt keine singulären Mechanismus, durch die ein einzelner thread kann nicht weiter ausgeführt werden im aktuellen Kontext, gehen Sie etwas anderes tun, und die Ausführung fortsetzen, an der exakten Linie, bei der es brach Weg. Wenn es möglich wäre, würde es die Niederlage der Zweck der mit Gewinde in den ersten Platz. Wie du schon erwähnt hast, ohne einen Schritt zurück und überdenken der gesamten Architektur, die elegante Ihrer Möglichkeiten zu sein scheint, mit einem anderen thread zu warten, für eine HTTP-Antwort, haben es die Aussetzung der Haupt-thread in einem sicheren Ort, Prozess die Antwort auf seine eigene, dann wieder von der Haupt-thread. In diesem Szenario könnten Sie überdenken, ob die thread-lokaler Speicher noch Sinn macht oder wenn Sie etwas ein wenig höher in den Rahmen wäre besser geeignet, als könnten Sie möglicherweise Abfall eine Menge von Zyklen kopieren jedes mal, wenn Sie unterbrechen den Haupt-thread.
Was Sie beschreiben ist das, was QueueUserAPC tut. Aber Die Idee der Verwendung es für diese Art von Synchronisierung macht mir ein bisschen unangenehm. Wenn Sie nicht wissen, dass der main-thread in einer sicher Stelle zu unterbrechen, dann sollten Sie wahrscheinlich nicht unterbrechen.
Ich vermute, Sie wäre besser dran, Angabe der Haupt-thread die Arbeit zu einem anderen thread, so dass es sitzen und warten, für Sie zu senden-Benachrichtigungen zu handhaben, dass Arbeit, die nur er bewältigen kann.
PostMessage
oderPostThreadMessage
in der Regel funktioniert wirklich gut für übergabe bits der Arbeit zu Ihrem Haupt-thread. Nachrichten behandelt werden, bevor Benutzer die Eingabe von Nachrichten, aber nicht bis der thread für Sie bereit.QueueUserAPC
. Jedoch, es scheint nicht zu funktionieren, wie meine anderen question Staaten.Ich verstehe vielleicht nicht die Frage, aber CreateSemaphore und WaitForSingleObject funktionieren sollte. Wenn ein thread auf das semaphor warten, es wird wieder aufgenommen, wenn der andere thread-Signale.
Update basiert auf den Kommentar: Der Haupt-thread kann Aufruf von WaitForSingleObject mit einer Wartezeit von null. In dieser situation, es wird fortgesetzt, sofort, wenn die semaphore nicht signalisiert. Der Haupt-thread könnte dann überprüfen Sie es auf einer regelmäßigen basis.
Sieht es aus wie die Antwort sollte erkennbar sein, von Microsoft MSDN. Vor allem aus diesem Abschnitt auf 'Die Synchronisierung der Ausführung von Mehreren Threads'
Wenn dir dein main-thread GUI-thread, warum nicht senden Sie eine Windows-Nachricht an Sie? Dass das, was wir alle tun, um die Interaktion mit dem win32-GUI von worker-threads.
Einen Weg, das zu tun, ist determiniert ist regelmäßig zu prüfen, ob eine HTTP-Antwort empfangen wurde.
Es ist besser für dich, zu sagen, was Sie versuchen zu erreichen.
In dieser situation würde ich ein paar Dinge. In Erster Linie würde ich wieder Struktur die Arbeit der Haupt-thread ist zu tun, um gebrochen zu werden in so kleine Stücke wie möglich. Das gibt Ihnen eine Reihe von sicheren Orten zu brechen, wird die Ausführung an. Dann willst du zum erstellen einer Warteschlange, wahrscheinlich mit dem microsoft-slist. Die slist wird Ihnen die Fähigkeit zu haben, ein thread hinzufügen, während ein anderer liest, ohne die Notwendigkeit für sperren.
Sobald Sie das haben, im Ort können Sie machen im wesentlichen Ihre Haupt-thread läuft in einer Schleife über jedes Stück Arbeit, die überprüfung in regelmäßigen Abständen, um zu sehen, wenn es Anfragen zu behandeln, die in der Warteschlange. Langfristige, was ist schön, über eine Architektur so ist, dass man relativ leicht beseitigen, der thread lokalisierte Speicherung und parallelisieren der Haupt-thread umwandeln, slist, um eine Warteschlange (wahrscheinlich immer noch mit dem slist), und die kleinen Stücke der Arbeit und die Antworten in der Arbeit Objekte, die dynamisch verteilt werden, alle verfügbaren threads.