/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
endl ikke tråd sikker?
Fra : Jesper Gødvad


Dato : 20-05-01 03:47

Hej Alle

Vi har haft en del problemer med at få connections + tråde til at køre. Det
korte af det lange er, at et skift fra cout til printf var nødvendigt for at
serveren ikke hang efter den første connection/tråd. Det fandt vi først ud
af meget sent og cout'erne var sat ind for at udskrive debug information, så
det hjalp os jo ikke tættere på en løsning.

Jeg har senere hørt at det ikke skulle være cout, men endl der er synderen.
Jeg troede at endl bare var:
typedef "\n" endl;
men det er den så åbenbart ikke.

Hvordan kan det være?

Er der forskel på cout og std::cout?

Vi bruger forøvrigt g++ under RedHat Linux 7.0

mvh. jesper




 
 
Frank Hahn (20-05-2001)
Kommentar
Fra : Frank Hahn


Dato : 20-05-01 09:45

"Jesper Gødvad" <Xesper@goedvad.dk> wrote in message
news:9e7av5$jtc$1@sunsite.dk...
> Hej Alle
>
> Vi har haft en del problemer med at få connections + tråde til at køre.
Det
> korte af det lange er, at et skift fra cout til printf var nødvendigt for
at
> serveren ikke hang efter den første connection/tråd. Det fandt vi først ud
> af meget sent og cout'erne var sat ind for at udskrive debug information,

> det hjalp os jo ikke tættere på en løsning.
>
> Jeg har senere hørt at det ikke skulle være cout, men endl der er
synderen.
> Jeg troede at endl bare var:
> typedef "\n" endl;
> men det er den så åbenbart ikke.

Har du prøvet at udskifte endl med "\n"..
Søg-og-erstat...

Jeg er dog overbevist om at det ikke hjælper på dit problem.
Spørgsmålet er vist nærmere om der oprettes en separat stdout-stream
for hver tråd og om skrivning til stdout er tråd-sikker..

/Frank




Jesper Gødvad (20-05-2001)
Kommentar
Fra : Jesper Gødvad


Dato : 20-05-01 16:32

Hej Frank

> Har du prøvet at udskifte endl med "\n"..
> Søg-og-erstat...

Nej, det har vi ikke for nu blev alt jo ændret til printf().
Men det virker jo lidt inkonsekvent at bruge printf() til det ene og cout
til det andet, så det er nok dét vi vil forsøge. I modsat fald skal alt den
øvrige kode omskrives til printf() da den jo også skal køre på serveren.

Jeg var nervøs for at helt "almindelige" ting ikke var trådsikre og min
øvrige kode ville få problemer når den blev implementeret på serveren.

> Jeg er dog overbevist om at det ikke hjælper på dit problem.
> Spørgsmålet er vist nærmere om der oprettes en separat stdout-stream
> for hver tråd og om skrivning til stdout er tråd-sikker..

Ikke at jeg ved noget som helst om det, men jeg tænkte på om vores brug af
filedescriptors omdirigerede noget in/output.

Men når bare det virker... 10 dage til aflevering.

mvh. jesper



Mogens Hansen (20-05-2001)
Kommentar
Fra : Mogens Hansen


Dato : 20-05-01 16:38

Hej Jesper,
"Jesper Gødvad" <Xesper@goedvad.dk> wrote in message
news:9e8nq5$9b3$1@sunsite.dk...
> Hej Frank
>
>
> Jeg var nervøs for at helt "almindelige" ting ikke var trådsikre og min
> øvrige kode ville få problemer når den blev implementeret på serveren.

Du skal kigge i dokumentationen til din platform for at finde ud af hvilke
garantier den stiller omkring trådsikkerhed.
Da hverken C eller C++ i sig selv kender noget til tråde, kan sproget i sig
selv ikke garantere noget.

Venlig hilsen

Mogens Hansen



Anders Bo Rasmussen (20-05-2001)
Kommentar
Fra : Anders Bo Rasmussen


Dato : 20-05-01 16:44

On Sun, 20 May 2001 17:37:58 +0200,
Mogens Hansen <mogens_h@dk-online.dk> wrote:

>> Jeg var nervøs for at helt "almindelige" ting ikke var trådsikre og min
>> øvrige kode ville få problemer når den blev implementeret på serveren.
>
>Du skal kigge i dokumentationen til din platform for at finde ud af hvilke
>garantier den stiller omkring trådsikkerhed.
>Da hverken C eller C++ i sig selv kender noget til tråde, kan sproget i sig
>selv ikke garantere noget.

Er der nogen der på stående fod hved hvad posix-standarden siger?

--
Anders Bo Rasmussen mailto:fuzz01@spamfilter.dk
Frimestervej 42 1.tv http://www.fuzz.dk
2400 Kbh. NV
Denmark

Kent Friis (20-05-2001)
Kommentar
Fra : Kent Friis


Dato : 20-05-01 10:07

Den Sun, 20 May 2001 04:46:34 +0200 skrev Jesper Gødvad:
>Hej Alle
>
>Vi har haft en del problemer med at få connections + tråde til at køre. Det
>korte af det lange er, at et skift fra cout til printf var nødvendigt for at
>serveren ikke hang efter den første connection/tråd. Det fandt vi først ud
>af meget sent og cout'erne var sat ind for at udskrive debug information, så
>det hjalp os jo ikke tættere på en løsning.
>
>Jeg har senere hørt at det ikke skulle være cout, men endl der er synderen.
>Jeg troede at endl bare var:
>typedef "\n" endl;
>men det er den så åbenbart ikke.
>
>Hvordan kan det være?

Prøv lige flg:

int main() {
cout << "Dette er en test";
   sleep(5);
   cout << " test 2" << endl;
}

Så vil du sandsynligvis se at cout ikke udskriver før den har en komplet
linie (incl. endl).

Så endl kan stadig godt være det samme som "\n" (jeg er dog ikke sikker
på at det er typedef - burde det ikke være const?)

Mvh
Kent
--
http://www.celebrityshine.com/~kfr/ - nu med Elgo-billeder

Morten Boysen (20-05-2001)
Kommentar
Fra : Morten Boysen


Dato : 20-05-01 12:06

"Jesper Gødvad" <Xesper@goedvad.dk> wrote in message
news:9e7av5$jtc$1@sunsite.dk...
> Jeg har senere hørt at det ikke skulle være cout, men endl der er
synderen.
> Jeg troede at endl bare var:
> typedef "\n" endl;
> men det er den så åbenbart ikke.

endl flusher også din stream. Du tvinger med andre ord et systemkald,
for at tømme bufferen.


--
Morten Boysen



Jesper Gødvad (24-05-2001)
Kommentar
Fra : Jesper Gødvad


Dato : 24-05-01 13:52


> > Jeg har senere hørt at det ikke skulle være cout, men endl der er
> synderen.
> > Jeg troede at endl bare var:
> > typedef "\n" endl;
> > men det er den så åbenbart ikke.
>
> endl flusher også din stream. Du tvinger med andre ord et systemkald,
> for at tømme bufferen.

Alt er skiftet ud med "\n" og det virker. Mht. systemkald kan det netop være
kritisk når jeg kører med tråde, da alle tråde stopper hver gang jeg bruger
systemkald.

Tak for hjælpen.

mvh. jesper



Frank Hahn (24-05-2001)
Kommentar
Fra : Frank Hahn


Dato : 24-05-01 16:54

"Jesper Gødvad" <Xesper@goedvad.dk> wrote in message
news:9eivtm$8h7$1@sunsite.dk...
>
> > > Jeg har senere hørt at det ikke skulle være cout, men endl der er
> > synderen.
> > > Jeg troede at endl bare var:
> > > typedef "\n" endl;
> > > men det er den så åbenbart ikke.
> >
> > endl flusher også din stream. Du tvinger med andre ord et systemkald,
> > for at tømme bufferen.
>
> Alt er skiftet ud med "\n" og det virker. Mht. systemkald kan det netop
være
> kritisk når jeg kører med tråde, da alle tråde stopper hver gang jeg
bruger
> systemkald.
>
> Tak for hjælpen.

Hmm.. dvs. dit system stadig ikke kører stabilt..
Det kræver jo bare et tilfælde hvor to streams (instanser af cout)
flusher på samme tid, for at det går galt ?

Måske du burde lave en monitor med cout.flush(), så kun en tråd
ad gangen kan flushe cout streamen..

Bare lige en tanke
/Frank




Jesper Gødvad (27-05-2001)
Kommentar
Fra : Jesper Gødvad


Dato : 27-05-01 22:38

> Hmm.. dvs. dit system stadig ikke kører stabilt..
> Det kræver jo bare et tilfælde hvor to streams (instanser af cout)
> flusher på samme tid, for at det går galt ?
>
> Måske du burde lave en monitor med cout.flush(), så kun en tråd
> ad gangen kan flushe cout streamen..

Njaee... sagen med tråde er netop at jeg kun har en process og Linux ikke
ved at jeg har flere ting kørende samtidigt. Når jeg laver systemkald
stopper hele processen, så en I/O fejl vil få alt til at gå ned.

Hvis jeg vil ud over problemet skal lave flere processer, men det giver så
noget bøvl med globale variabler o.lign.

Anyway skal "tingen" afleveres på fredag klokken 12 og det virker som sagt


mvh. jesper



Thomas Jespersen (20-05-2001)
Kommentar
Fra : Thomas Jespersen


Dato : 20-05-01 15:30

"Jesper Gødvad" <Xesper@goedvad.dk> writes:

> Hvordan kan det være?

Jeg er ikke så skrap til C++, så jeg tager muligvis fejl :)

Men du kan i C++ gøre flg.:

cout << hex << 56;

Du har nu ændret en tilstand i dit cout stream, nemlig sat den til
"hex". Hvis du har en anden tråd der skriver:

cout << 99;

vil du vel få problemer med at den er sat i "hex-tilstand". Derfor kan
jeg forestille mig at streamen bliver låst indtil dit output er
færdigt. Jeg ved ikke hvornår C++ flusher sit output, men hvis det er
når den møder et "endl" ligger forklaringen nok der.

Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste