Java мьютекс с smp - PullRequest
       53

Java мьютекс с smp

0 голосов
/ 06 июля 2010

Я учусь многопоточному программированию;и во время практики мьютекса, я замечаю, что, похоже, он не работает правильно на моем двухъядерном ноутбуке.

Код мьютекса имеет значение 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

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

Что-то не так с моим кодом?Или есть какой-нибудь ресурс, содержащий примеры запуска java mutex на smp / dule-core / множественном процессоре?

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

Ответы [ 3 ]

1 голос
/ 06 июля 2010

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

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

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

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

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 голосов
/ 11 июля 2010

Я думаю, что примерно знаю проблему моего кода.Напечатанная строка в 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

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

...