I3MUP1+-+Exercise+5.1

=Exercise 5.1 - Inter-thread communication=

Exercise 1: Creating a message queue
Første skridt var at designe en klasse med de beskeder vi ville sende rundt, men den var allerede lavet i opgave beskrivelsen. Vi har lavet structs som er afledte af Message klassen, som er specifikke for forskellige typer beskeder. Det er også derfor Messages destructor er virtuel, da vi ønsker at en eventuel destructor i en mulig afledt klasse skal blive kaldt først. Næste skridt var at designe besked køen. Vi har valgt at bruge biblioteket til at implementere en FIFO kø struktur. Da vores kø skal kunne håndtere forskellige beskeder, med forskellige data, vælger vi at vores kø skal bestå af strukts som inde holder en pointer til en besked og en ID som fortæller hvad det er for en type besked. Da flere skal kunne sende beskeder til samme kø, er det vigtigt, at kun en har adgang af gangen, så vores data ikke bliver korrupt. Det sikres med mutexes Her er send funktionen som indsætter vores struct i køen:



Vi bruger en conditional til at vente indtil køen ikke længere er fuld. Derefter indsættes (push) beskeden og ID'en i køen. På nu værende tidspunkt, ved vi at besked køen ikke er tom, så vi sender et signal om at køen ikke er tom. Det er vigtigt, da recieve funktionen skal være blokerende, og derfor vil stå og vente på et signal om at der er noget i køen.



Når der er noget i køen vil funktionen hente det og slette det fra køen. Dermed ved vi at køen ikke er fuld, og kan derfor sende signal om det.! Køens størrelse bliver sat i construktoren, samt initialisering af conditionals og mutex. De bliver nedlagt i destructoren.

Exercise 2: Sending data from one thread to another
For at kunne sende en Point3D struct, opretter vi en afledt besked som indeholder structen.Så oprettes to tråde til henholdsvis sender og modtager. Begge har en reference til samme kø, da den ene indsætter på den og den anden skal trække ud fra den. Sender tråden opretter beskeder med new, og sætter indholdet af beskederne, hvorefter de bliver send på den medgivne kø.



Når modtager tråden modtager en besked, skal den undersøge hvad det er for en type besked, og det gør den ved hjælp af den medsendte ID. Derefter kan den caste beskeden til den rigtige type, og håndtere hvad der skal ske.



Efter beskeden er blevet behandlet, skal modtageren udføre delete på beskeden. Normalt vil man gøre sådan at den som opretter med new også skal nedlægge med delete, men det er ikke muligt her, da sender tråden ikke ved hvornår reciever tråden er færdig med at bruge beskeden. Systemet virker også selvom der bliver oprettet flere sender tråde, som sender beskeder ind på samme besked kø.