|
| 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,
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.
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.
| |
|
|