Я новичок в информатике, и я читаю книгу, в которой представлены потоки и мьютексы. Я пробовал программировать мьютекс на Java, который, кажется, работает большую часть времени, но время от времени это не так.
В моем коде критическая секция добавляет числа от 1 до 10 к статической переменной j, что дает 55 (если j начинается с 0). Если я запускаю три потока одновременно через критическую секцию, я получаю случайные конечные значения j, что имеет смысл.
Но с приведенным ниже мьютексом большую часть времени я получаю конечное значение j 165 (55 * 3), что мне и нужно, но иногда я получаю случайные значения j. Может ли кто-нибудь взглянуть на мой код и посмотреть, что происходит? Спасибо!
public class Mythread extends Thread {
private static int j = 0;
private static int mutex = 0; // Initial value of the mutex is 0;
@Override
public void run() {
while (test_and_set(mutex) == 1) {
// wait here if mutex is 1
System.out.println("Thread waiting..");
}
for (int i = 1; i <= 10; i++) { // Start of Critical section
j += i; //
}
System.out.println(j); // End of Critical section
// Should add on 55 to j if one thread is running through the CS
mutex = 0; // Thread that has finished the CS sets the mutex to 0.
}
public static int test_and_set(int oldMutexValue) {
if (mutex == 0) {
mutex = 1;
}
return oldMutexValue;
}
}
public class Test1 {
public static void main(String[] args) {
Mythread thread1 = new Mythread();
Mythread thread2 = new Mythread();
Mythread thread3 = new Mythread();
thread1.start();
thread2.start();
thread3.start();
}
}
volatile
не поможет вtest_and_set
. Действие не атомарное. - person Sotirios Delimanolis   schedule 09.10.2014