I am trying to learn to use threads in C ++, but to be stumped on a bug I'm not working for fun.
I use a mutetek for synchronization:
mutex mux1;
and a threaded function:
zero dualer (player and player, player and enemy) {(sleep (player .get_as ()); mux1 .lock (); Cout & lt; player.get_name () & lt; "hit" & lt; enemy ;get_name () & lt; "for" & lt; & Lt; player .get_tr () << "damage!" & Lt; endl; enemy.dmg (player.get_str ()); mux1.unlock ();} while ((enemy.ask_dead ()! = True) & amp; amp; amp; (player.ask_dead ()! = True));}
Which I call in main (full code):
int main (player player 1 ("Casper", 100, 5, 200); Player Player 2 ("Bigger", 150, 8, 3000); Thread Deller 1 (Dialer, Player 1, Player 2); Thread Dweller 2 (Dialer, Player 2, Player 1); dueler1.join (); dueler2.join (); Cout & lt; endl & lt; Lt; "war is over!";}
makes threaded function player () fight against each other:
class player {Public: Player (string name_, NTMHP_, int strangut_, int objection:) {name = name_; Maxhp = maxhp_; Hp = maxhp; Strength = sharp; Attacks / attacks; Ided = false; } Zero is complete () {hp = maxhp; } Zero dmg (int dmg) {hp - = dmg; If (HP & lt; 0) dead (); } Zero free () {isdead = true; Cout & lt; & Lt; Name & lt; & Lt; "Died like a pitiable"; } String get_name () {return name; } Int get_hp () {return hp; } Int get_maxhp () {return maxhp; } Int get_str () {Return Strength; } Int get_as () {returnpepeed; } Bool ask_dead () {return isdead; } Private: string name; Intestine maxhp; Intel HP; Intestine; Int attacking; Bull-eyed; };
The problem occurs when Player2
becomes:
- Thread 1 (which handles the damage dealt by player 1
- Thread 2 (which is the
Player2
that dies) continues to run, and Player1 is dead untilwhile
details Completely ignore
I was expecting to end because of condition
(player.ask_dead (!)! = True)
should fail .
Any suggestions?
You have properly synchronized by putting a mutete to avoid concurrent access to your object. It's already a very good start!
Problem:
The problem is that when you make a thread, it creates a personal copy of the arguments passed by you (see also)
You can easily verify the references by adding these first statements to the duler ():
cout & lt; & Lt; "Dealer with player" & lt; & Lt; (Zero *) and player & lt; & Lt; "And Anonymous" & lt; & Lt; (Zero *) and Enemy & lt; & Lt; Endl;
When called You have to use to make sure that all the threads actually see the same object: When a player dies, then its OK! In one game you can argue that the player is dead but still is walking with the person suffering from this sword ... but we can fix it by adding a condition when entering the safe area: dueler ()
based on context, the reference does not refer to the original object (local variables in main)> ) But on its clone,
solution:
Thread dueler1 (Duel, Std :: ref (Player1), std :: ref (Player2)); Thread Deller 2 (Dualer, Stade :: Ref (Player 2), std :: Ref (Player 1));
Other comments:
Dual Answer ()
function is most waiting for Mute X is. So when the mitix is released, it damages despite being dead
mux1.lock (); // We were waiting, at a certain time (if! Players. Ask_dead ()) {// then check whether we are still alive & lt; & Lt; Player .get_name () & lt; & Lt; "Hit" & lt; & Lt; Enemy .get_name () & lt; & Lt; "For" & lt; & Lt; Player .get_st () & lt; & Lt; " Damage!" & Lt; & Lt; Endl; Enemy.dmg (player.get_str ()); } Mux1.unlock ();
No comments:
Post a Comment