Problem mit globalen Variabeln

C:
#include "stdlib.h"
#include "windows.h"
#include "stdio.h"
#include "conio.h"
#include "time.h"
#include "unistd.h"


  FILE *fp;
   char Eingabe[4096];
   char* stop;
       HANDLE hMutex;
   
DWORD WINAPI Thread()
{
   
   if(WaitForSingleObject(hMutex, INFINITE)==WAIT_OBJECT_0)
{
   strcpy(Eingabe,stop);
   puts(Eingabe);
}
 
   ReleaseMutex(hMutex);

  //[...]
  
  fclose(fp);
  remove("Speicher");
  
  //Spuren verwischen
  return -2;
  //Ende

}

int main()
{   
    char Satz[4096];
    char Analyse[4096];
    char* stop;
    
    printf("Gib den Satz ein:\n");
    scanf("%[^\n]", &Satz);
    
   stop=strtok(Satz," ");
   char Eingabe[4096];
   
   HANDLE hMutex = CreateMutex(NULL,FALSE,NULL);

     while(stop!=NULL)
    {

    strcpy(Eingabe,stop);
    CreateThread(NULL, 0, Thread, NULL, 0, NULL); 
    _sleep(1000);
    printf("%d",Thread());
    }

    printf("\n\n");
    system("PAUSE");
    
    
    CloseHandle(hMutex);
    fclose(fp);
    return 0;
}

Die [...] stehen für einen langen Code, der meines Erachtens hier nicht relevant ist. Das Programm ist der Lateinübersetzer, bei dem du mir ja schonmal geholfen hast. Hier sollen Sätze analysiert werden, ich arbeite zwecks Übersichtlichkeit mit dem Thread und return-Werten. Jede Form hat ihren eigenen Return-Wert. -2 steht für Error; der Debugger meldet einen Segmentation Fault (Zugriffsproblem - > Mutex). So steht's im Moment. Wenn ihr wollt, gebe ich euch den ganzen Code, mit 900 Zeilen dachte ich aber nicht, ihr möchtet das durchlesen.

Gruss
cwriter
 
Hi.

Evlt. solltest du mal dazusagen warum du überhaupt Multi-Threading verwenden willst. Momentan erkenne ich nicht wozu.

Dann startest du einmal die Funktion Thread als neuen Thread und rufst diese danach auch noch auf.

Du darfst ReleaseMutex nur aufrufen, wenn du den Mutex auch in Besitz genommen hast. (also WaitForSingleObject WAIT_OBJECT_0 zurückgegeben hat.

\edit: Der Segmentationsfehler hat aber nichts mit dem Mutex zu tun. (du hast nicht gesagt welche Zeile der Fehler auftritt!)

Deine globalen Variablen eingabe und stop sind nicht initialisiert, da diese durch die lokalen Variablen eingabe und stop in main überschattet werden.

Gruß
 
Zuletzt bearbeitet:
Wenn ich den Mutex in das main() verschiebe, erkennt der Thread den Mutex nicht (first use in this function).
Logisch, oder?!
Wenn ich aber den Handle global mache und nur die "Öffnung" in das main() packe, kommt kein Error
Auch logisch. So ist es ja auch gedacht.
PS: Hast du schon mal was von der pthread.h gehört? Kennt Dev-C++ nämlich auch nicht :-(
Das ist eine Zusatzbibliothek die für POSIX (Unix, Linux) Systeme entwickelt wurde. Es gibt auch eine Version für Windows. (http://sourceware.org/pthreads-win32/)

Gruß
 
Hallo

MEIN GOTT BIN ICH BLÖD! Der einzige Fehler war dieser:
Deine globalen Variablen eingabe und stop sind nicht initialisiert, da diese durch die lokalen Variablen eingabe und stop in main überschattet werden.
Jetzt funktioniert auch alles! Du bist GENIAL, Deepthroat! Vielen Dank!

cwriter
 
Zurück