2010-07-05 3 views
0

Я изучаю многопоточное программирование; и, практикуя мьютексы, я замечаю, что, похоже, это не работает правильно на моем ноутбуке dule-core.Java mutex с smp

Код мьютекс на http://pastebin.com/axGY5y3c

В результате, как показано ниже:

count value:t[0]1 
count value:t[1]1 
count value:t[2]2 
count value:t[3]3 
count value:t[4]4 

Результат показывает, что приличнее нити будет получить тот же значение инициализации в начале. Это выглядит некорректно.

Что-то не в порядке с моим кодом? Или есть ли какой-либо ресурс, предоставляющий примеры запуска jute-мьютекса на smp/dule-core/multiple cpus?

Спасибо за помощь.

ответ

1

Я не очень хорошо знаком с алгоритмами mutex, поэтому я не могу помочь вам строго в отношении параллелизма. Я, однако обнаружить одну строку в коде, который объясняет, почему вы получите значения, перечисленные:

public class MyThread extends Thread{ 
    // [...] 
    private static int count = 0; 

При запуске четырех потоков, run() называют четыре раза, увеличивающиеся count каждой итерации.

Этот блок кода:

t[i].start(); 
int v = t[i].getCountValue(); 
System.out.println("count value:t["+i+"]"+v; 

Поэтому эффективно:

count++; 
System.out.println("count value:t["+i+"]"+count); 
+0

Кроме того, в строке 54 вы подразумеваете 'this.count', тогда как' count' является статическим. –

1

Как отметил Павел, у вас есть путаница, что «счетчик» объявлен как статический, но тогда, когда вы извлекаете это, вы подразумеваете, что вы не хотите, чтобы он был статичным. По сути, вам нужно решить, что вы хотите от программы.

... Но в любом случае, есть и другие вопросы:

  • в своей реализации, вы подключаетесь структурами данных общих между потоками (каждый поток может иметь свой собственный элемент массива, но фактический массив ссылка разделяется между потоками); в соответствии с моделью памяти Java, вам необходимо предпринять шаги, чтобы сделать это безопасным (например, объявление массивов final или volatile или использование атомного массива);
  • Существуют стандартные библиотеки параллелизма, которые на самом деле могут быть эффективными на практике (или, по крайней мере, быть правильными и более гибкими), хотя, конечно, как академическое упражнение, понимающее параллельные алгоритмы, не так уж плохо.
0

Я думаю, что я грубо знаю проблему моего кода. Печатная строка в Test.java содержит функцию getCountValue(), которая не находится на границе блокировки (mutex.lock()/mutex.unlock()); поэтому, когда поток начинает печатать значение счета, что приводит к условию гонки, потому что печать значения счета не должна ждать другого потока.

После перемещения getCountValue() внутри функции run(), которая находится внутри границы блокировки. Результат выглядит корректно. Он печатает

pid:0 count value:1 
pid:2 count value:2 
pid:3 count value:3 
pid:1 count value:4 
pid:4 count value:5 

Еще раз спасибо за помощь. Я ценю это.