Re[38]: Многопоточность, параллелизм
От: Cyberax Марс  
Дата: 26.10.06 10:49
Оценка:
Yuri Khomich wrote:
> Да нет же: "however, compilers are allowed to reorder the instructions
> in either thread, when this does not affect the execution of that thread
> in isolation."
> JLS, 3rd Edition, Chapter 17.3
> (http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.4)
http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.4

Synchronization actions, which are:
* Volatile read. A volatile read of a variable.
* Volatile write. A volatile write of a variable.

* Lock. Locking a monitor
* Unlock. Unlocking a monitor.
* The (synthetic) first and last action of a thread
* Actions that start a thread or detect that a thread has
terminated, as described in §17.4.4.


Далее, в 17.4.4
(http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.4)
видим:

Every execution has a synchronization order. A synchronization order is
a total order over all of the synchronization actions of an execution.
For each thread t, the synchronization order of the synchronization
actions (§17.4.2) in t is consistent with the program order (§17.4.3) of t.


И отсюда делаем вывод, что для volatile'ов запрещен reordering.

PS: блин, я стал language lawyer
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[39]: Многопоточность, параллелизм
От: Yuri Khomich  
Дата: 26.10.06 11:33
Оценка:
Hello, Cyberax!
You wrote on Thu, 26 Oct 2006 10:49:52 GMT:

C> Yuri Khomich wrote:

>> Да нет же: "however, compilers are allowed to reorder the
>> instructions in either thread, when this does not affect the
>> execution of that thread in isolation."
>> JLS, 3rd Edition, Chapter 17.3
>> (http://java.sun.com/docs/books/jls/third_edition/html/memory.
>> html#17.4)
C> http://java.sun.com/docs/books/jls/third_edition/html/memory.html#
C> 17.4

C> Synchronization actions, which are:
C> * Volatile read. A volatile read of a variable.
C> * Volatile write. A volatile write of a variable.

C> * Lock. Locking a monitor * Unlock. Unlocking a monitor.
C> * The (synthetic) first and last action of a thread *
C> Actions that start a thread or detect that a thread has
C> terminated, as described in §17.4.4.


C> Далее, в 17.4.4

C> (http://java.sun.com/docs/books/jls/third_edition/html/memory.html#
C> 17.4)
C> видим:
C>

C> Every execution has a synchronization order. A synchronization
C> order is a total order over all of the synchronization actions of
C> an execution.
C> For each thread t, the synchronization order of the
C> synchronization actions (§17.4.2) in t is consistent with the
C> program order (§17.4.3) of t.


C> И отсюда делаем вывод, что для volatile'ов запрещен reordering.


Вы вообще следите за дикуссией?
Сообщением выше я сказал что reorder разрешен для nonvolatile переменных.
Вы возразили. Теперь вы говорите: для volatile'ов запрещен reordering. Запрещен конечно. Только я этому и не возражал.
Posted via RSDN NNTP Server 2.0
Re[40]: Многопоточность, параллелизм
От: Cyberax Марс  
Дата: 26.10.06 12:50
Оценка:
Yuri Khomich wrote:
> C> И отсюда делаем вывод, что для volatile'ов запрещен reordering.
> Вы вообще следите за дикуссией?
> Сообщением выше я сказал что reorder разрешен для nonvolatile переменных.
> Вы возразили.
Я не возражал. Я ответил, что лучше по-другому сформулировать — в новой
спеке добавилось запрещение на reorder для volatile.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[41]: Многопоточность, параллелизм
От: Yuri Khomich  
Дата: 26.10.06 13:17
Оценка:
Hello, Cyberax!
You wrote on Thu, 26 Oct 2006 12:50:32 GMT:

C>>> И отсюда делаем вывод, что для volatile'ов запрещен reordering.

>> Вы вообще следите за дикуссией?
>> Сообщением выше я сказал что reorder разрешен для nonvolatile
>> переменных.
>> Вы возразили.
C> Я не возражал. Я ответил, что лучше по-другому сформулировать — в
C> новой спеке добавилось запрещение на reorder для volatile.

Не подумайте, что я занимаюсь букво***ом , но вот ваши слова: "Скорее по-другому: для non-volatile переменных запретили reorder.". Это не так. Из-за чего и сыр-бор.
Или это описка просто?
Posted via RSDN NNTP Server 2.0
Re[42]: Многопоточность, параллелизм
От: Cyberax Марс  
Дата: 26.10.06 14:02
Оценка:
Yuri Khomich wrote:
> C> Я не возражал. Я ответил, что лучше по-другому сформулировать — в
> C> новой спеке *добавилось* запрещение на reorder для volatile.
> Не подумайте, что я занимаюсь букво***ом , но вот ваши слова: "Скорее
> по-другому: для non-volatile переменных запретили reorder.". Это не так.
> Из-за чего и сыр-бор.
> Или это описка просто?
Действительно, очепятался. Очень извиняюсь.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[37]: Многопоточность, параллелизм
От: n0name2  
Дата: 27.10.06 10:01
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Потому что в спеке на CLR _явно_ прописано запрещение таких reorder'ов,

C>гарантируется что память будет гарантировано когерентна. В спеке на JVM
C>Memory Model такой гарантии не дается.

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

public class A {
    public int count;

    public static void main(String [] args) {
        A a = new A();
        for (int i = 0; i < 1000; i++) a.count++;
    }
}


на .NET потенциально в разы медленнее т.к. нужно каждый раз count писать в память а то не дай бог соседний thread из него почитает?
Re[38]: Многопоточность, параллелизм
От: Cyberax Марс  
Дата: 27.10.06 10:37
Оценка:
n0name2 wrote:
> я правильно понимаю, что, как следствие, нельзя хранить переменные в
> регистрах и код вроде этого:
> public class A {
> public int count;
>
> public static void main(String [] args) {
> A a = new A();
> for (int i = 0; i < 1000; i++) a.count++;
> }
> }
> на .NET потенциально в разы медленнее т.к. нужно каждый раз count писать
> в память а то не дай бог соседний thread из него почитает?
Не знаю, подозреваю что да. Хотя это достаточно редкая ситуация.

В .NET гарантируется, что поведение потока будет наблюдаться одинаково
из любого другого потока. В данном случае, в принципе, компилятор имеет
право вынести чтение и запись в a.count за пределы цикла, так как это не
меняет видимого поведения программы.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[39]: Многопоточность, параллелизм
От: n0name2  
Дата: 27.10.06 10:51
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Не знаю, подозреваю что да. Хотя это достаточно редкая ситуация.


почему, собственно, редкая? вообще сюда (потенциально) относится любое присваивание или модификация любых полей или ссылок. т.е. фактически любое изменение состояния.

C>В .NET гарантируется, что поведение потока будет наблюдаться одинаково

C>из любого другого потока. В данном случае, в принципе, компилятор имеет
C>право вынести чтение и запись в a.count за пределы цикла, так как это не
C>меняет видимого поведения программы.

почему не меняет? допустим, этот main() запущен в двух потоках над одним и темже экземпляром A.
тогда вроде как нужно заново читать a.count перед каждой операцией ++ и каждый раз записывать a.count в память чтобы результаты были доступны всем?
причем по сути VM не знает — может ли данная переменная быть использована в нескольких протоках (нет escape analysis) и должна по умолчанию делать все переменные аналогом Java volatile?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.