Einfache multithreading-mutex-Beispiel ist falsch
Ich erwarten, um die zahlen von 0 bis 4 in zufälliger Reihenfolge, aber stattdessen habe ich einige nicht synchronisierte Durcheinander
Was ich falsch mache?
#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
void addQuery(void *v );
HANDLE ghMutex;
int main()
{
HANDLE hs[5];
ghMutex = CreateMutex( NULL, FALSE, NULL);
for(int i=0; i<5; ++i)
{
hs[i] = (HANDLE)_beginthread(addQuery, 0, (void *)&i);
if (hs[i] == NULL)
{
printf("error\n"); return -1;
}
}
printf("WaitForMultipleObjects return: %d error: %d\n",
(DWORD)WaitForMultipleObjects(5, hs, TRUE, INFINITE), GetLastError());
return 0;
}
void addQuery(void *v )
{
int t = *((int*)v);
WaitForSingleObject(ghMutex, INFINITE);
cout << t << endl;
ReleaseMutex(ghMutex);
_endthread();
}
InformationsquelleAutor triclosan | 2011-10-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lesen Sie und schreiben Sie die freigegebene variable innen das Schloss. Sie Lesen es außerhalb der Sperre und somit kein lock irrelevant.
Aber auch das ist nicht genug, da Ihre gemeinsame variable ist eine Schleife variable, Sie schreiben zu, ohne den Schutz des Schlosses. Ein viel besseres Beispiel laufen würde wie dieses:
Wenn Sie können, verwenden Sie einen kritischen Abschnitt eher als ein mutex, weil Sie einfacher zu benutzen und effizienter. Aber Sie haben die gleiche Semantik, dass Sie nur zum Schutz von code, der in die Verriegelung blockieren.
Hinweis: Jerry hat Zeiger aus einige andere Probleme, aber ich habe mich konzentriert auf das hohe Niveau trheading und Serialisierung betrifft.
int counter
ist mir klar. Aber wie kann ich einige Daten angelegt, um thread-Funktion?Sie übergeben es den gleichen Weg, den Sie Taten, aber nicht einen Zeiger auf einen Schleifenzähler!!
InformationsquelleAutor David Heffernan
Ihre
synchronized
ist nicht falsch!Das problem ist, dass man die Adresse der variable
i
im Parameter der FunktionaddQuery
- wenn der erste thread läuft, es nicht gewährleisten, dassi
hat immer noch den Wert 0, da in der Zwischenzeit hätte es geändert, um den nächsten Wert in der Schleife.Können Sie den code aus David Heffernan's Antwort.
InformationsquelleAutor waty