CS-opas:Monisäikeinen ohjelmointi

Mureakuha

Loikkaa: valikkoon, hakuun
Teknisistä rajoituksista johtuen artikkelin yllä näkyvä otsikko on virheellinen. Oikea otsikko on C#-opas: Monisäikeinen ohjelmointi.

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());
		}
	}
}

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());
			}
		}
	}
}
Henkilökohtaiset työkalut