Implementing a Multithreading Framework in C++
Maaranen, Tero (2011)
Maaranen, Tero
2011
Tietotekniikan koulutusohjelma
Tieto- ja sähkötekniikan tiedekunta - Faculty of Computing and Electrical Engineering
This publication is copyrighted. You may download, display and print it for Your own personal use. Commercial use is prohibited.
Hyväksymispäivämäärä
2011-08-17
Julkaisun pysyvä osoite on
https://urn.fi/URN:NBN:fi:tty-2011082514770
https://urn.fi/URN:NBN:fi:tty-2011082514770
Tiivistelmä
Monisäikeistä ohjelmistoa suunniteltaessa ja toteutettaessa on usein järkevää aloittaa luomalla ohjelmistokehys, joka hallinnoi toistuvia, hankalasti hahmotettavia ja monimutkaisia rinnakkaisuuteen liittyviä toimenpiteitä. Kehyksen luonti saattaa itse asiassa olla ohjelmistoprojektin aikaa vievin osuus, ja itse toiminnallisuuden lisäys onkin vain viimeinen silaus muuten valmiiseen järjestelmään.
Tässä esitellään säikeidenväliseen kommunikointiin tarkoitetun kehyksen luontiprosessia ja sen toteutukseen vaikuttaneita syitä. Tavoitteena oli toteuttaa pienessä mittakaavassa toimiva mutta mahdollisimman monta käyttötarkoitusta tukeva ohjelmistokehys, joka ei kuitenkaan olisi tarpeettoman tehoton. Lisäksi tarkoitus oli pyrkiä kehittämään monisäikeisten ohjelmien ymmärrettävyyttä ja vähentää niiden monimutkaisuutta. Ohjelman varsinainen käyttötarkoitus on mahdollistaa monisäikeisen pelimoottorin vakaa ydin.
Niinkin monipuolisessa aiheessa kuin monisäikeinen ohjelmointi ei ole olemassa yleispätevää ratkaisua, joka selvittää kaikki kehittämisongelmat. On kuitenkin mahdollista löytää tiettyjä toimintatapoja, joita käyttämällä voidaan merkittävästi helpottaa osaa ongelmista.
Työssä on keskitytty täysin yksiprosessiseen ohjelmistoon, mutta muokkaamalla ja uudelleenkäyttämällä olemassa olevia rajapintoja, kehyksen voi saada toimimaan useiden prosessien välisessä kommunikoinnissa.
Työssä on mitattu tehokkuutta perinteisestä monisäikeisestä ohjelmasta ja vastaavan toiminnallisuuden sisältävästä ohjelmistokehystä käyttävästä ohjelmasta. Tuloksista saa käsityksen, että kehystä käytettäessä tehokkuus on heikentynyt merkittävästi. Lisäksi erityisesti pienissä ohjelmissa ohjelmiston lähdekoodinluettavuus - hieman yllättäen - kärsii monimutkaisemmasta rakenteesta ja kehyksen käytön aiheuttamasta lisästä. Voidaan kuitenkin olettaa, että suuremmissa ohjelmistoprojekteissa, joissa perinteinen monisäikeinen ohjelmisto saattaa muodostua äärimmäisen monimutkaiseksi, ohjelmistokehys selkeyttää ohjelmaa tehokkuuden kustannuksella. When designing and implementing multithreaded software, it is often justified to start by building a robust framework that handles the repetetive and complicated procedures required of a multithreaded application. This can be the most time consuming process, and adding the actual functionality on top of the framework can be considered only as the final touch.
In the thesis work, a multithreading framework has been designed and implemented from scratch. The goal was to build a relatively small framework which could be used for practically any multithreaded program. Yet, it was attempted to keep in mind some of the most important aspects of multithreaded programming, such as understandability, complexity and performance.
For such a complex topic as multithreaded programming, there is no silver bullet approach to solve all problems, but one approach can still fit to many needs. The implemented framework concentrates on single-process applications, but by reimplementing some parts of the framework, also inter-process communication can be made possible. The actual intended use for the framework is to form the core for a multithreaded game engine.
Performance analysis is provided in small scale by implementing well-knownalgorithms. The analysis shows that performance is clearly degraded compared to conventional multithreading solutions, and that, especially in small projects, code readability suffers from the more complex nature of framework usage. This implies that frameworks suits larger projects better, as in such projects the conventional approach tends to grow into an unmaintainable and messy source code.
Tässä esitellään säikeidenväliseen kommunikointiin tarkoitetun kehyksen luontiprosessia ja sen toteutukseen vaikuttaneita syitä. Tavoitteena oli toteuttaa pienessä mittakaavassa toimiva mutta mahdollisimman monta käyttötarkoitusta tukeva ohjelmistokehys, joka ei kuitenkaan olisi tarpeettoman tehoton. Lisäksi tarkoitus oli pyrkiä kehittämään monisäikeisten ohjelmien ymmärrettävyyttä ja vähentää niiden monimutkaisuutta. Ohjelman varsinainen käyttötarkoitus on mahdollistaa monisäikeisen pelimoottorin vakaa ydin.
Niinkin monipuolisessa aiheessa kuin monisäikeinen ohjelmointi ei ole olemassa yleispätevää ratkaisua, joka selvittää kaikki kehittämisongelmat. On kuitenkin mahdollista löytää tiettyjä toimintatapoja, joita käyttämällä voidaan merkittävästi helpottaa osaa ongelmista.
Työssä on keskitytty täysin yksiprosessiseen ohjelmistoon, mutta muokkaamalla ja uudelleenkäyttämällä olemassa olevia rajapintoja, kehyksen voi saada toimimaan useiden prosessien välisessä kommunikoinnissa.
Työssä on mitattu tehokkuutta perinteisestä monisäikeisestä ohjelmasta ja vastaavan toiminnallisuuden sisältävästä ohjelmistokehystä käyttävästä ohjelmasta. Tuloksista saa käsityksen, että kehystä käytettäessä tehokkuus on heikentynyt merkittävästi. Lisäksi erityisesti pienissä ohjelmissa ohjelmiston lähdekoodinluettavuus - hieman yllättäen - kärsii monimutkaisemmasta rakenteesta ja kehyksen käytön aiheuttamasta lisästä. Voidaan kuitenkin olettaa, että suuremmissa ohjelmistoprojekteissa, joissa perinteinen monisäikeinen ohjelmisto saattaa muodostua äärimmäisen monimutkaiseksi, ohjelmistokehys selkeyttää ohjelmaa tehokkuuden kustannuksella.
In the thesis work, a multithreading framework has been designed and implemented from scratch. The goal was to build a relatively small framework which could be used for practically any multithreaded program. Yet, it was attempted to keep in mind some of the most important aspects of multithreaded programming, such as understandability, complexity and performance.
For such a complex topic as multithreaded programming, there is no silver bullet approach to solve all problems, but one approach can still fit to many needs. The implemented framework concentrates on single-process applications, but by reimplementing some parts of the framework, also inter-process communication can be made possible. The actual intended use for the framework is to form the core for a multithreaded game engine.
Performance analysis is provided in small scale by implementing well-knownalgorithms. The analysis shows that performance is clearly degraded compared to conventional multithreading solutions, and that, especially in small projects, code readability suffers from the more complex nature of framework usage. This implies that frameworks suits larger projects better, as in such projects the conventional approach tends to grow into an unmaintainable and messy source code.