Problem mit globalen Variabeln

Die Mutex-Variable ist ein Handle zu einer entsprechenden Systemresource. Da der Mutex für alle Programmabschnitte verfügbar sein muss, die konkurrierende Zugriffe behandeln sollen, ist das Anlegen im Hauptprogramm oder global natürlich am sinnvollsten.

Gruß
MCoder
 
Ja, entschuldigung. Den Code habe ich aus dem Gedächtnis geschrieben, daher rühren die Fehler. Und ja, ich kann den gesamten Code posten, aber daran hättet ihr wahrscheinlich keine grosse Freude, denn er ist um die 900 Zeilen lang.

C:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>
 
char string;
 
DWORD WINAPI Thread()
{
   system("PAUSE");
   printf("%s",string);
}
 
 
int main()
{
    CreateThread(NULL, 0, Thread, NULL, 0, NULL); 
    scanf("%s",&string);
    _sleep(1000);
   system("PAUSE");
   return 0;
}
Ja, es ist kein schönes Beispiel, aber ein besseres fällt mir gerade nicht ein. Wie verwendet man nun hier einen Mutex?
Mein Problem ist im Moment, dass ich den Mutex nicht global anlegen kann. Es kommt immer die Meldung "string integer is not a constant". Weiss jemand, wie man das beheben kann?

cwriter
 
Dun hast recht, das Beispiel ist nicht besonders gut, weil hier ein Mutex keinen Sinn macht: Es gibt keine konkurrierenden Schreibzugriffe auf eine gemeinsame Datenstruktur. Ich habe daher mal schnell ein kleines Beispiel geschrieben; auch schnell aus dem Gedächtnis. Deshalb keine Gewähr für Richtigkeit ;)
C++:
#include <windows.h>
#include <iostream>
  
HANDLE g_hMutex = CreateMutex(NULL, FALSE, NULL);; 
  
DWORD WINAPI ThreadA(LPVOID lpParam)
{
    WaitForSingleObject(g_hMutex, INFINITE);
    Sleep(1);
    std::cout << "Das ist Thread A" << std::endl;
    ReleaseMutex(g_hMutex);
    
    return 0;
}
 
DWORD WINAPI ThreadB(LPVOID lpParam)
{
    WaitForSingleObject(g_hMutex, INFINITE);
    std::cout << "Das ist Thread B" << std::endl;
    ReleaseMutex(g_hMutex);
    
    return 0;
}
 
DWORD WINAPI ThreadC(LPVOID lpParam)
{
    WaitForSingleObject(g_hMutex, INFINITE);
    std::cout << "Das ist Thread C" << std::endl;
    ReleaseMutex(g_hMutex);
    
    return 0;
}
 
int main()
{
    CreateThread(NULL, 0, ThreadA, NULL, 0, NULL);
    CreateThread(NULL, 0, ThreadB, NULL, 0, NULL); 
    CreateThread(NULL, 0, ThreadC, NULL, 0, NULL); 
    
    Sleep(100);
    return 0;
}
Du kannst ja mal probieren, was ohne Mutex passiert (wenn die Zeilen WaitForSingleObject... und ReleaseMutex... auskommentiert werden).
Gruß
MCoder
 
Zuletzt bearbeitet:
Erstmal danke für die Geduld, MCoder!
Ein Error wird bei mir zurückgeben:"initializer element is not constant". Wenn ich den CreateMutex() in das main() verschiebe, gibt's keinen Error, das Programm funktioniert aber nicht. Woran kann das liegen? (Dev-C++ vielleicht?)

cwriter
 
Hallo,

wird wohl am Compiler liegen. Ich hab's heute früh mal schnell mit dem Visual Studio compiliert und da kommt kein Fehler. Auch wenn ich die Zuweisung "g_hMutex = CreateMutex(NULL, FALSE, NULL);" ins main() verschiebe, ändert sich nichts am Programmverhalten.

das Programm funktioniert aber nicht.
Wie äußert sich das? Werden die Texte nicht auf der Konsole ausgegeben?

Gruß
MCoder
 
Tja, das ist in der Tat seltsam:
Wenn ich den Mutex in das main() verschiebe, erkennt der Thread den Mutex nicht (first use in this function). Wenn ich aber den Handle global mache und nur die "Öffnung" in das main() packe, kommt kein Error, dafür funktioniert es nicht (Im Sinne von die Variabeln werden nicht freigegeben).

cwriter
PS: Hast du schon mal was von der pthread.h gehört? Kennt Dev-C++ nämlich auch nicht :-(
 
Dun hast recht, das Beispiel ist nicht besonders gut, weil hier ein Mutex keinen Sinn macht: Es gibt keine konkurrierenden Schreibzugriffe auf eine gemeinsame Datenstruktur.
Ein Mutex macht aber nicht nur bei gemeinsamen Schreibzugriffen Sinn. Es gibt einen schreibenden und einen lesenden Zugriff. Also ist ein Mutex doch durchaus sinnvoll.

Man hätte sicherlich auch einen Event verwenden können um zu signalisieren, das die Daten zum Schreiben verfügbar sind.
wird wohl am Compiler liegen.
Nunmal nicht so voreilig ;) Bei mir funktioniert es tadellos (MinGW GCC 4.5)

Allerdings verwendet cwriter C (was den "initializer element is not constant" Fehler erklärt) und hat deshalb sicherlich das Programm verändert...

Gruß
 
Ich habe das Programm verändert? Du meinst, dass ich MCoders Code so kopiert habe? Das habe ich nicht. Ich habe einzig die Funktionen des Mutex kopiert. Was ist ein "Event"? Und wie behebt man den intializer-Error?

cwriter
 
Ich habe das Programm verändert? Du meinst, dass ich MCoders Code so kopiert habe? Das habe ich nicht. Ich habe einzig die Funktionen des Mutex kopiert.
Das Problem ist, das du nicht gesagt bzw. gezeigt hast was genau du gemacht hast.

Zeige den Code.

Zeige das Problem. (Fehlermeldungen, Programmausgabe usw.)
Was ist ein "Event"?
http://msdn.microsoft.com/en-us/library/ms686360(v=VS.85).aspx :google:
Und wie behebt man den intializer-Error?
Man kann in C keine globalen Variablen mit nicht-konstanten Werten initialisieren. Man muss die Initialisierung in einer Funktion vornehmen.

Gruß
 
Zurück