2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4
 
 
Сообщение24.11.2008, 15:22 


12/09/08

2262
Фома в сообщении #161532 писал(а):
В Java прямой аналог глобальных переменных - статические переменные класса. В этом случае, в качестве counter могла выступать вполне рядовая (экземплярная) переменная класса.
Так этож без разницы. Компайлеру все равно известно, что она лежит не в экземляре, а в сегменте данных и адресуется всеми (или многими) желающими.

Впрочем, насчет приличности, может я и зря. По такому критерию ни один из современных компайлеров C/C++ не будет считаться приличным :lol:

 Профиль  
                  
 
 
Сообщение24.11.2008, 15:32 
Аватара пользователя


26/02/06
179
Хижина дяди Тома
И тут меня заело. Чичас попробую на С# повторить такой фокус :lol:

З.Ы. Только кофе попью :D

 Профиль  
                  
 
 
Сообщение24.11.2008, 15:58 


19/11/08
347
Фома писал(а):
И тут меня заело. Чичас попробую на С# повторить такой фокус :lol:

З.Ы. Только кофе попью :D

Ага ... только приготовтесь долго ждать.

Я как-то написал программу (на с++) с самодельным механизмом синхронизации.
Вместо EnterCriticalSection использовал WaitForSingleObject плюс незащищёные переменные (почти как в примере).
И моя программа примерно раз в месяц! зависала по "непонятным причинам".
После скурпулёзного анализа всего кода (довольно большого) я пришёл к выводу, что эти зависания не могут быть ничем иным чем тем самым маловероятным случаем , когда поток задачи будет прерван именно между теми двумя операциями , вероятность чего я считал бесконечно малой ...

Но ... после изменения метода синхронизации зависания прекратились.

Так, что кто хочет на деле проверить вариант с переменой очереди выполнения ... пусть приготовится к долгому ожиданию.

Во первых сама вероятность прерывания именно в этом месте очень мала (а у C# могут быть свои соображения на этот счёт - где переключать задачи), во вторых, ещё сама вероятность смены очереди вычислений должна быть не очень велика (если вообще это не относится к операторам с разным временем исполнения) и плюс есть ещё вариант, что неизвестно - может ли быть в этот момент вообще быть прерван поток...

Короче не менее месяца придётся ждать.

А ещё возможно что, для "успеха" эксперимента, обе переменные должны находиться на разных страницах памяти ... ну тут уж вероятность ещё в несколько тысяч раз меньше.

 Профиль  
                  
 
 
Сообщение24.11.2008, 19:34 


12/09/08

2262
Андрей АK в сообщении #161550 писал(а):
Так, что кто хочет на деле проверить вариант с переменой очереди выполнения ... пусть приготовится к долгому ожиданию.
Как-то у Вас плохо эксперимент поставлен. Можно ведь гораздо быстрее выяснить:
Код:
extern int count;

void wait() {
  while(count == 0) ;
}
Код:
        .file   "qq.c"
        .text
        .p2align 4,,15
.globl wait
        .type   wait, @function
wait:
        movl    count, %eax
        testl   %eax, %eax
        je      .L6
        rep ; ret
.L6:
        jmp     .L6
        .size   wait, .-wait
        .ident  "GCC: (GNU) 4.2.4 (Ubuntu 4.2.4-1ubuntu3)"
        .section        .note.GNU-stack,"",@progbits

Даже запускать ничего не надо, все ясно и понятно. ;)

 Профиль  
                  
 
 
Сообщение24.11.2008, 19:43 


19/11/08
347
Ничего этот ваш пример не покажет - процессор наверняка никогда не поменяет операторы, если это может повлиять на результат.
Он может поменять только независимые операторы - в которых идёт обращение к разным участкам памяти или регистрам.
И тут без двух потоков не обойтись.
И вообще я что-то не понял в чём там (в вашем примере) состоит проверка?
Там просто цикл jmp L6 и всё (может L6 поставить в начало функции?).
И что такое "rep ; ret"?
Типа оператор ret может выполниться раньше условного перехода?
Ну так такого тоже быть не может - иначе бы ни один компьютер не работал как надо.

 Профиль  
                  
 
 
Сообщение24.11.2008, 20:18 


12/09/08

2262
Андрей АK в сообщении #161626 писал(а):
Ничего этот ваш пример не покажет - процессор наверняка никогда не поменяет операторы, если это может повлиять на результат.
Здесь уже это не при чем. Разговор давно уже не про перестановки. Здесь сразу видно, что была одна проверка, а больше никого значение переменной не интересует.

Добавлено спустя 19 минут 41 секунду:

Андрей АK в сообщении #161626 писал(а):
И что такое "rep ; ret"?
Типа оператор ret может выполниться раньше условного перехода?
Точно не помню, но точно не это. Склероз мне подсказывает, что если ret идет сразу после условного перехода, то между ними надо вставить что-то незначащее, чтоб конвейр лучше работал. А вот почему rep, а не nop, тут я пас ;)

 Профиль  
                  
 
 
Сообщение24.11.2008, 22:19 
Аватара пользователя


31/10/08
1244
вздымщик Цыпа
Это AMD'шные трюки. Чтобы предсказатель переходов работал лучше в данном направлении нужно перед ret добавить инструкцию. Если нужно чтобы эта ветка сработывала режи то наоборот. Можно и Nop, но AMD рекомендует пару rep ret. Толи это свзяано с тем что AMD NOP за инструкию не считает. Толи rep более привелегированна для предсказания так, как организует цикл.

 Профиль  
                  
 
 
Сообщение06.12.2008, 22:57 


02/09/08
143
rep - это не инструкция, а префикс. В силу его редкого использования его заюзали для несвойственной цели. По-хорошему в таких случаях нужно использовать для него другое название.

 Профиль  
                  
 
 
Сообщение11.12.2008, 00:41 
Аватара пользователя


01/07/08
25
Очень не люблю я такие задачи. Правильный ответ: такое делать нельзя, получиться может что угодно в зависимости от конкретной ситуации (процессора, компилятора, ос и т. д.). А если такой код показывают при приеме на работу, это наводит на некоторые размышления -- неужели нормального кода тут нет?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 54 ]  На страницу Пред.  1, 2, 3, 4

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group