3.2.11.1.3 Kritischer Abschnitt

{{#index:kritischer Abschnitt|Abschnitt, kritisch|unkritischer Abschnitt|Abschnitt, unkritisch}} Im Quelltext aller Prozesse oder Threads lassen sich Abschnitte identifizieren, welche kritisch oder unkritisch im Hinblick auf Race Conditions sind.


Definition: Kritischer Abschnitt

Definition

Unter einem kritischen Abschnitt versteht man Programmteile, die während ihrer Ausführung auf der CPU nicht durch kritische Abschnitte anderer Prozesse oder Threads unterbrochen werden dürfen, sofern die beteiligten Prozesse oder Threads gemeinsam genutzte Betriebsmittel besitzen.


Definition: Unkritischer Abschnitt

Definition

Unter einem unkritischen Abschnitt versteht man jeden Programmteil, der keinen kritischen Abschnitt darstellt.


Als Programmteil im Sinne der vorangegangenen Definitionen kann jeder Codeabschnitt mit der geforderten Eigenschaft gelten. Diese Programmteile lassen sich sowohl in einer Hochsprache wie Java, C, C++, Pascal, usw. identifizieren, als auch in Maschinencode oder Assembler.


Hinweis

Du musst dich daran erinnern, dass ein in einer Hochsprache wie Java, C, C++, Pascal, usw. angegebener Befehl in seiner Übersetzung in Maschinencode bzw. Assembler in mehrere kleine Befehle resultieren kann. Falls dir das entfallen war, so schau noch mal auf die Seite Vom_Quellcode_zum_Prozessor.

Ein Kontextwechsel findet immer zwischen zwei Maschinenbefehlen auf der CPU statt!


Beispiel

public class Beispiel_Kritischer_Abschnitt {

static int counter = 0;

public static class Thread_A extends Thread {
	public void run() {
		do_something();
		count_from_10();
		do_something_else();
	}
	private void do_something() {
		System.out.println("Thread A: Hier ist noch alles unkritisch.");		
	}
	private void count_from_10() {
		// Diese Methode ist ein kritischer Abschnitt!
		counter = 10;
		counter++;
		counter++;
		System.out.println("A-Counter: " + counter);		
	}
	private void do_something_else() {
		System.out.println("Thread A: Hier ist wieder alles unkritisch.");		
	}
}
	
public static class Thread_B extends Thread {
	public void run() {
		counter = 20;
		counter++;
		counter++;
		counter++;
		counter++;
		counter++;
		counter++;
		System.out.println("B-Counter: " + counter);
	}
}

public static void main(String[] args) {
	Thread a = new Thread_A();
	Thread b = new Thread_B();
	a.start();
	b.start();
}

}



Diese Seite steht unter der Creative Commons Namensnennung 3.0 Unported Lizenz http://i.creativecommons.org/l/by/3.0/80x15.png