Thread forsætter i C++

Tags:    c++ threads mulitithreading thread

godaften folkens.

sad og rodede med noget combat sjov i C++ og faldt over en "ikke hensigtsmæssig fejl"

main
Fold kodeboks ind/udC++ kode 


Player.h
Fold kodeboks ind/udC++ kode 




problemet ligger umiddelbart i
Fold kodeboks ind/udC++ kode 

når den ene spiller dræber den anden afsluttes den tråd korrekt, men den anden tråd fortsætter med at angribe selvom han selv er død? det er sikkert simpelt, men tror jeg har stirret mig blind på det, og ville derfor hører om der måske var nogle af jer der kunne finde fejlen

godaften
Kasper Torp



4 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 10 karma
Sorter efter stemmer Sorter efter dato
Var i gang med at skrive det her da du løste det:

Hmm for lidt nogle andre resultater end dig. I den første var det kun en enkelt gang den døde kunne angribe for meget.

I det seneste kunne jeg ikke fremkalde noget problem, men tror dog du har en potential deadlock nu.

Deadlock:

A står f.eks. i linje 10, og B står i starten af 15 og har derfor tjekket betingelsen. Men B kan ikke låse endnu. A slår B ihjel og frigiver låsen. Nu tager B låsen, så tjekker den betingelsen i while, hvilket ikke holder og derfor går ud af løkken uden at frigive låsen. Efter at have sovet står A og venter på låsen.

Edit: Nåh ja, her var det foreslag jeg ville komme med at du kunne prøve, før du fik det til at virke:

Fold kodeboks ind/udC++ kode 


Edit igen (kan ikke lave ny post når man har den sidste):

Havde ikke lige fået læst ordentligt.

ref på objekterne, da tråde åbenbart Kopirer args ind og ikke bruger & som værende referencer, derfor bruge ref(), når man ønsker at arbejde direkte på et objekt.


Dette ville forklare en del. Undrede mig også over hvorfor jeg ikke kunne bruge dit eksempel direkte. Jeg ændrede funktionen til at tage 2 pointere i stedet for, for at få det til at compile.



Indlæg senest redigeret d. 17.03.2015 21:58 af Bruger #14645
Den døde angriber kun engang efter dødsfaldet?

Problemet ligger i at du ikke synkroniserer på ask_dead(). Lad os kalde dem for vinder og taber:

Taber har låsen, og vinder sover. Taber angriber og frigiver låsen. Så tjekker taber om en af dem er døde - siden hans angreb fejlede er det ikke tilfældet. Han går tilbage til toppen af løkken og sover. Nu vågner vinder, tager låsen, giver det dræbende stød så taber nu er død. Han frigiver låsen og ser at taber er død så han afslutter. Nu vågner taber (lol han er død :P), og tager låsen. Han tjekkede om der var nogen døde før han sov og det var der ikke. Efter at tage låsen, angriber han vinder, frigiver låsen og ser nu at han er død.

Så et problem er at de sover efter at have tjekket for game over. Dette problem kunne løses ved at flytte _sleep ned i bunden af løkken, og det vil løse problemet for alle de tests du kan lave i konsollen.

Men mit gæt er du stadig ville have en race condition! Som jeg lagde ud med, er det nok nødvendigt at dit ask_dead check også bliver synkroniseret på.

Edit: selv uden sleep ville der være en race condition på betingelsen.



Indlæg senest redigeret d. 17.03.2015 18:43 af Bruger #14645
hej Søren.

tak for svaret, har rettet som du sagde med at flytte Sleep ned i bunden, desuden har jeg prøvet mig med at låse mens tjekket på while løkken sker, desvære uden held.

angående dit 'spørgsmål?', så nej, den døde angriber indtil den 'levende' også er død, ikke før det er han tilfreds :P lol
Fold kodeboks ind/udC++ kode 

dette er som den ser ud nu, har dog læst op på raceconditions, men synes at det burde være løst i koden ovenfor, desværre sker der stadig det samme, og er meget usikker på hvad der er fortsat er galt



EDIT: OPDATE, fandt problemet

havde ikke fået objekterne ordenligt ind i min thread
Fold kodeboks ind/udC++ kode 


ref på objekterne, da tråde åbenbart Kopirer args ind og ikke bruger & som værende referencer, derfor bruge ref(), når man ønsker at arbejde direkte på et objekt.





Indlæg senest redigeret d. 17.03.2015 21:46 af Bruger #16938
tak igen for svaret, opdagede godt min deadlock et par minutter efter jeg havde postet og fik det løst.

Tak for hjælpen!, lukker tråden her :)



t