CS-opas:Monisäikeinen ohjelmointi
Mureakuha
- Teknisistä rajoituksista johtuen artikkelin yllä näkyvä otsikko on virheellinen. Oikea otsikko on C#-opas: Monisäikeinen ohjelmointi.
[muokkaa]
Metodin suorittaminen omassa säikeessä
using System; using System.Threading; public class H3 { private int _i; public static void Main() { H3 h1 = new H3(4); //Oliot, jotka tekee työtä H3 h2 = new H3(5); //Annetaan säikeille viittaukset olion metodiin, joka //säikeessä suoritetaan Thread t1 = new Thread(new ThreadStart(h1.Tehtava)); Thread t2 = new Thread(new ThreadStart(h2.Tehtava)); //Käynnistetään säikeet t1.Start(); t2.Start(); } //rakentaja luokalle, jossa tehtava metodin käyttämä arvo //asetetaan annetaan parametrina. Tehtava metodi //tulostelee huvikseen sitten annettua arvoa. public H3(int i) { _i = i; } //metodi, joka tekee, jotain tärkeää ja pitkään public void Tehtava() { for(int i =0;i<100000;i++) { Console.WriteLine(_i.ToString()); } } }
[muokkaa]
Kilpailutilanne esimerkki
using System; using System.Threading; public class H3 { private static System.Int32 _i; public static void Main() { H3 h1 = new H3(); //Oliot, jotka tekee työtä H3 h2 = new H3(); //Kerrotaan suoritettavat metodit säikeille Thread t1 = new Thread(new ThreadStart(h1.Tehtava)); Thread t2 = new Thread(new ThreadStart(h2.Tehtava)); //Käynnistetään säikeet t1.Start(); t2.Start(); Console.WriteLine("{0}",H3._i); } public H3() { } public void Tehtava() { //lockilla voidaan estää tiettyjen luokkien ilmentymien //yhtäaikainen käyttö. lock( typeof(H3) ) { int k; for(int i =0;i<10;i++) { k = H3._i; k++; Thread.Sleep(100); //hidasteaan, niin muutkin säikeet saa aikaa H3._i=k; Console.WriteLine(k.ToString()); } } } }
