Jos käynnistän kaksi samaa säiettä yhtä aikaa, voivatko ne sotkea toistensa toimintaa jotenkin?
Esim. tällainen hyvin yksinkertainen säie: UINT saie(LPVOID lp){while a==1{tulosta a;};}
Jos tämä säie käynnistetään kaksi kertaa, mutta toisen säikeen a:n arvoa muutetaankin kakkoseksi, niin pysyykö ensimmäisen säikeen a:n arvo edelleen ykkösenä? Tarkoittaako se, että säikeet jakavat saman muistialueen sitä, että kummankin säikeen a:n arvo sijaitsee täsmälleen samassa kohtaa tietokoneen muistia?
Esim. tällainen hyvin yksinkertainen säie: UINT saie(LPVOID lp){while a==1{tulosta a;};}
Jos tämä säie käynnistetään kaksi kertaa, mutta toisen säikeen a:n arvoa muutetaankin kakkoseksi, niin pysyykö ensimmäisen säikeen a:n arvo edelleen ykkösenä? Tarkoittaako se, että säikeet jakavat saman muistialueen sitä, että kummankin säikeen a:n arvo sijaitsee täsmälleen samassa kohtaa tietokoneen muistia?
Vastaukset 5
Vanhimmat
Tietääkseni säikeet ei jaa samaa muisti avaruutta vaan niillä on oma pinonsa.
Kun luot säikeen niin eikös siinä anneta funktio parametriksi. Jolloin sitä kutsutaan kuin normaalia funktiota jolla on omat paikkaliset muutujansa.
Säikeet nimenomaan jakavat muistinsa. Mutta niillä on oma pino, joten paikalliset muuttujat ovat säikeiden omia.
Jos toi a on globaali muuttuja niin siinä tapauksessa sen arvo muuttuu.
jakavat prosessoriaikaa, jokainen saa aikaviipaleen. (Sehän on selvää, meillä on käytössää ainoastaan yksi prosessori, ei se voi tehdä muuta kuin yksi tehtävä kerralla! Ja ennen kuin se pystyy vaihtamaan tehtävää sen on tallennettava vanhan tehtävän CPU-rekisterit sekä pinon (stack) tiedot pois tieltä ja ladattava edellisen tehtävän vastaavat tiedot takaisin!
Jokaiselle stack (missä on aliohjelman kutsuparametrit) säilytetään sellaisenaan. Kaikki viittaukset Heapiin (Ram) pysyvät ennellaan, eli jos siellä jotain muuttuu, thread (onko suomeksi säie?!!) ei tiedä siitä yhtään mitään.
Ellei sinulla ole moniprosessoriympäristö (transputer) monisäkeisyys ainoastaan HIDASTAA toimintaa. Vaikka näennäisesti vot alkaa kirjoittamaan MS-Wordiin ennen kuin sanakirjat oikeinkirjoitusta varten ovat latautuneet, tämä on ainoastaan silmälumetta. Kirjoittaminen on hidasta ja takkuista.
Ohjelmoija on kokonaan vastuussa threadien synkronoinnista (myös jos on rinnakkaisprosessori-ympäristö, keskeytystä haluava prosessori nostaa ns. exception (interrupt, keskeytys johon kaikki muut täytyy vastata (ei välttämättä keskittämään toimintansa)).
Idea threadeissä on vähän sama kuin team-workissa (turkulaisittain: Joukossa hässilöinti). Eli kaikki suorittavat oman osuuteensa ja tavataan silloin kuin kaikki ovat valmiit. Jos kuitenkin on tilanne että ainoastaan yksi kaveri työskentelee (prosessori), on aika lapsellista ajatella että jotain menee nopeammin jos se samanaikaisesti joutuu antamaan väliaikaisraportteja toisten töistä!
Eli ennen rinnakkaisprosessoreita koko touhu on ainoastaan (lähes yksinomaan) lapsellista harjoittelua mitä kannattaa käyttää harkiten.
Sanoin "lähes aina". Esimerkki koska se on paikallaan: Tekstinkäsittelyssä syöttö (näppäimistö) on niin hidasta että prosessorilla riittää joutoaikaa. Oikenkirjoitus (joka on hidasta) ei voi aloittaa toimintansa ennen kuin kokonainen sana on syötetty.
Eli tehdään kaksi threadia, toinen toistaa kirjoittajan kirjoittamaa tekstiä, toinen tarkistaa sitä. Vaikka huomautus kirjoitusvirheestä tulee kymmenen sekuntia myöhässä se ei häiritse ketään, jos joutuu odottamaan seuraavan kirjaimen ilmestymistä ruudulle 10 s se häiritsee kaikkia.
> Ellei sinulla ole moniprosessoriympäristö
> (transputer) monisäkeisyys ainoastaan HIDASTAA
> toimintaa. Vaikka näennäisesti vot alkaa
> kirjoittamaan MS-Wordiin ennen kuin sanakirjat
> oikeinkirjoitusta varten ovat latautuneet, tämä on
> ainoastaan silmälumetta. Kirjoittaminen on hidasta
> ja takkuista.
Saanen olla hieman eri mieltä asiasta. Ensinnäkin nykyään prosessorit pystyvät suorittamaan usean säikeen koodia samanaikaisesti (esim. Sun UltraSPARC T1 pystyy yhdessä coressa ajamaan 4:n säikeen koodia yhtäaikaisesti, Xeon kahta). Tuon lisäksi on muitakin vastaavia tekniikoita käytössä, joita hyödynnetään (esim. pipelining).
Toisekseen suuri osa sovelluksen toiminnasta on erilaista (hidasta) IO:ta (esim. odotetaan tavuja verkkokortilta), jolloin käyttöjärjestelmä voi skeduloida toisen säikeen ajettavaksi.
Jos kommentoisin kirjoitustasi, ohjelmoijan näkökulmasta.
Monisäikeisyys ei hidasta mitään, vaikka säikeiden vaihto vie prosessori aikaa. Silloin kun yksi säie on levossa, niin silloin ajetaan toista säiettä. Esimerkiksi, kun yksi säie jää odottamaan dataa kovalevyltä, verkkokortilta, äänikortilta, sarjaportista, jne. (kestää vaikka 2 ms), niin tänä aikana suoritetaan toista säiettä. Näin siis monisäikeinen ohjelma voi tehdä 2 ms sen saman, mikä yksisäikeisellä ohjelmalla kestäisi 4 ms. Puhuit kyllä joutoajasta, mutta ajattelin painottaa, että sitä joutoaikaa todellakin on, ja usein säikeet ovat vain lepotilassa.
Säikeet eivät ole mielestäni lapsellista harjoittelua, sillä niille ei ole ohjelmointiteknisesti mitään muutakaan vaihtoehtoa (ehkä vain prosessit). Moniprosessorikoneiden tulo ei muuta säikeiden käsittelyä ohjelmoijan kannalta mitenkään, sillä ohjelmoijaa ei kiinnosta se kuinka monessa prosessorissa koodia suoritetaan.
Kehotus käyttää säikeitä harkiten kuulosta myös kummalliselta, koska todellisuudessa ongelma on kuitenkin se, ettei säikeitä käytetä vaikka niitä pitäisi käyttää. Käyttöliittymänkin tekeminen olisi aika hankalaa, ilman säikeitä. Valitettavasti vielä nykyäänkin törmää liian usein ohjelmiin joiden käyttöliittymät ovat jumissa datankäsittelyn (esim. luku, prosessointi, jne.) aikana, koska ohjelmoija ei ole tehnyt datankäsittelylle omaa säiettä.