Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » threads und umgebungsvariablen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
06.08.2003, 01:52 Uhr
kronos
Quotenfisch
(Operator)


hi!
mal wieder 'ne frage: wenn ich eine funktion als thread starte, sollte sie laut doc auf den kompletten speicherbereich der aufrufenden funktion zugreifen können, allerdings frisst das der compiler nicht, weil ihm nicht klar ist, dass die funktion als thread aufgerufen wird.
also z.b.:

C++:
int threadfunktion() {
    int value=0;
    while(value!=-1) {
        if (value!=newValue) {
            printf("wert wurde geändert!");
            value=newValue;
        }
    }
}

int main() {
    int newValue=0;
    CreateThread(threadfunktion);

    /* ...blabla...
     * ...wert wird geändert...
     */


    return 0;
}


funktioniert nicht, wegen newValue undeclared in threadfunktion... was tun? nochmal deklarieren? oder muss es global sein?
vielen dank für antworten!

--edit: Ich hab mir erlaubt, den Code etwas übersichtlicher zu formatieren und eine fehlende } einzufügen.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 06.08.2003 um 10:15 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.08.2003, 07:54 Uhr
Tommix



Hallo,
also
1. Multithreading ist nicht Bestandteil des Standards und
2. Welche Doc behauptet denn sowas?

Gruss, Tommix

Edit:
Ich will mit 2 die Behauptung nicht anzweifeln. Ich meine nur, von welcher Doc ist überhaupt die Rede.
Sachlich richtig dürfte die Sache schon sein - Zugriff auf Speicher hat ja erstmal nichts mit dem Gültigkeitsbereich von Variablen zu tun.

- Tommix

Dieser Post wurde am 06.08.2003 um 07:58 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.08.2003, 09:08 Uhr
0xdeadbeef
Gott
(Operator)


-->
CreateThread ist WinAPI, wenn mich nicht alles täuscht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.08.2003, 09:37 Uhr
ao

(Operator)


@kronos:
Ich nehme mal an, dass wir hier von Win32-Threads reden.

Die Threadfunktion ist falsch deklariert, richtig ist:

C++:
int threadfunktion (void * pParam)
{ /* ... */ }



Das pParam kannst du benutzen, um die Threadfunktion mit beliebigen Parametern zu versorgen. Der Wert, der hier rauskommen soll, muß in CreateThread reingesteckt werden, und zwar als erstes Argument hinter den Pointer auf die Threadfunktion.

Was für ein Objekt du da reinsteckst, ist Windows völlig egal, das ist ne Sache nur zwischen dem Thread-Erzeuger und der Threadfunktion selbst. Das kann ein einzelner Wert sein oder ein Zeiger auf eine Struktur, ganz wie dein Programm es braucht.

Du musst nur drauf achten, dass das Objekt gültig bleibt, solange die Threadfunktion darauf zugreift, d.h. dass der Scope des Objekts so lange nicht verlassen wird.

Lokale Daten innerhalb der Erzeuger-Funktion sind daher unsicher, wenn nicht durch eine Synchronisation zwischen Thread und Erzeuger garantiert ist, dass der Erzeuger aufgehalten wird, bis der Thread mit dem Auswerten der Parameter fertig ist.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.08.2003, 09:42 Uhr
ao

(Operator)



Zitat:
kronos postete
wenn ich eine funktion als thread starte, sollte sie laut doc auf den kompletten speicherbereich der aufrufenden funktion zugreifen können

Hmmmm .... hier scheint ein Missverständnis vorzuliegen. Welche Doku ist das? Kannst du das mal hier zitieren oder, falls es MSDN ist, die genaue Stelle angeben?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.08.2003, 10:19 Uhr
0xdeadbeef
Gott
(Operator)


Die threadfunktion kennt newValue doch garnicht. Nein, wenn das irgendwie hinhauen soll, muss es so aussehen:

C++:
int newValue;

int threadfunktion() {
    int value=0;
    while(value!=-1) {
        if (value!=newValue) {
            printf("wert wurde geändert!");
            value=newValue;
        }
    }
}

int main() {
    CreateThread(threadfunktion);

    /* ...blabla...
     * ...wert wird geändert...
     */


    return 0;
}


Übrigens nimmt die CreateThread-Funktion des WinAPIs mehr als einen Parameter entgegen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
06.08.2003, 10:41 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat:
0xdeadbeef postete
Übrigens nimmt die CreateThread-Funktion des WinAPIs mehr als einen Parameter entgegen.

Es reicht aber wie ao gesagt hat glaub ich einer, mehr hab ich bis jetzt noch nie verwendet.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
06.08.2003, 10:49 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
siehe Bsp. von Stefan:
www.fun-soft.de/showtopic.php?threadid=1272&time=1060112721
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
06.08.2003, 15:46 Uhr
kronos
Quotenfisch
(Operator)


also, ich rede NICHT von winAPI, sondern von SDL, falls euch das was sagt. aber da verhält sich das ganz ähnlich, ich muss woll mit zeigern arbeiten, die übergeben werden. die doc war richtig, nur mein beispiel, dass ich kopiert hab' war fehlerhaft...

naja, da ich schon in hier gelandet bin, bleiben mit bin winAPI die static variablen einer funktion erhalten, wenn diese als thread ausgeführt wurde?
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 06.08.2003 um 15:51 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
06.08.2003, 16:31 Uhr
0xdeadbeef
Gott
(Operator)


Ups...
Odysseus-Thread...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: