kluGe 1 Жалоба Опубликовано: 11 л Ну и до кучи для особо вумных небольшая задача class CrazyType { public static Func<int> SF = () => 42; public static readonly int Foo = GetFoo(); private static int GetFoo() { return Task<int>.Factory.StartNew(SF).Result; } } class CrazyType2 { public static readonly int Foo = GetFoo(); public static Func<int> SF = () => 42; private static int GetFoo() { return Task<int>.Factory.StartNew(SF).Result; } } Сойдёт за ответ? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mmoustaf 102 Жалоба Опубликовано: 11 л А объяснение-то где? Я ж тебе написал - взаимоблокировки в статическом конструкторе например Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mmoustaf 102 Жалоба Опубликовано: 11 л Какие блокировки, чего блокировки, где блокировки? Программерам нужна конкретика. Ты на техсовете также многозначительно-бесполезно отвечаешь Нет, на техсовете, я обычно однозначно говорю, что люди которым нужно все разжевать - мудаки. Поэтому каждый год я увеличиваю свою з/п на 30% Первый поток видит обращение к статическому члену типа CrazyType значит должен его проинициализировать Потом наверное захватывает внутреннюю блокировку чтобы вызвать конструктор При вызове вызывается гетфу Потом в теле гетфу мы запускаем еще один таск И ждем завершения В результате стартует новая задача, а там вызывается тот же самый метод. Повторяем описанное выше из второго потока. При захвате блокировки во второй итерации залипаем, поскольку ее первый поток не отпустил. Рэйс кондишн Наберут по объявлению Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mmoustaf 102 Жалоба Опубликовано: 11 л Перепишите на нормальном интерпретируемом языке. Похоже, что Игорь просто на собеседовании сидит. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mmoustaf 102 Жалоба Опубликовано: 11 л 2-й работающий вариант делает все тоже самое. Так почему же он работает? Я отвечал на вопрос Вот это не работает. Объясните почему. Тебе нужен ответ и на вопрос, почему первый вариант работает? Я тебе его нарисую. Только я не понимаю зачем? Тебя на новую работу не берут? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kluGe 1 Жалоба Опубликовано: 11 л Нет Там можно придумать кучу способов, чтобы все работало. А объяснение-то где? Так в моей версии оно тоже не работает Только я переписал проще. А объяснение звучит слишком нудно, не интересно и в нём есть слова вроде "замыкания" Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mmoustaf 102 Жалоба Опубликовано: 11 л 2-й работающий вариант делает все тоже самое. Он делает не то же самое. Извини. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mmoustaf 102 Жалоба Опубликовано: 11 л Короче во втором случае опыт программирования на с++ подсказывает мне, что тут виноват компилятор. Он генерирует для второго потока вложенный класс замыкания, статический конструктор которого вызывается независимо. И блокировки нет. Программерам нужна конкретика. Не путай программистов и быдлокодеров. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
URI 0 Жалоба Опубликовано: 11 л С праздником Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
maksims 1 Жалоба Опубликовано: 11 л Одному мне кажется, что тут кое-кто не очень понимает потоковые модели? Нутам, что на разных ОС они разные. А еще мне кажется, что ктото путает понятия "поток" и "задача" =) Но, зато различает быдло- и аристо-кодеров =) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mmoustaf 102 Жалоба Опубликовано: 11 л Одному мне кажется, что тут кое-кто не очень понимает потоковые модели? Нутам, что на разных ОС они разные. А чо сишарп он на какой-то еще ос кроме виндовз работает? При чем тут понимание потоковых моделей? Вопрос Игоря он про конкретную реализацию блокировок и замыканий в конкретном компиляторе. А еще мне кажется, что ктото путает понятия "поток" и "задача" =) При чем тут понятия "потока" и "задачи" вообще? От этого изменится правильность моего объяснения? Под словом таска имеется ввиду класс Task Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mmoustaf 102 Жалоба Опубликовано: 11 л Теперь да. Ааа.. Моно и все такое - это что ли? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mmoustaf 102 Жалоба Опубликовано: 11 л Да. Я сам не видел, но пацаны рассказывали, что работает плохо. Ну я тебе тоже не скажу, я с моно пару раз поигрался и бросил. Согласно парадоксу блаба я обошелся без него. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kluGe 1 Жалоба Опубликовано: 11 л Все-то он знает Я незнаю куда девается NRE И это начинает походить на баг в TaskScheduler-e Ибо даже если добавить в конфиг бросание Unobserved исключений, процесс не дохнет Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mmoustaf 102 Жалоба Опубликовано: 11 л Да он просто никому не нужен. На *nix такой зоопарк языков, что С# погоды не делает. Ну ты ж понимаешь. Знаешь сишарп - умный. Не знаешь - лох. Раньше так с джавой было, до того с плюсами. Скоро еще напридумывают, мож хаскель в моду войдет. Или еще какой брэйнфак Я незнаю куда девается NRE И это начинает походить на баг в TaskScheduler-e Ибо даже если добавить в конфиг бросание Unobserved исключений, процесс не дохнет А юзерстори если распилить подробнее? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kluGe 1 Жалоба Опубликовано: 11 л А юзерстори если распилить подробнее? Эээ, кого распилить? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
sergant 3 Жалоба Опубликовано: 11 л $ diff -b /tmp/1 /tmp/2 11,12c11 < int x = 42; < return Task<int>.Factory.StartNew(() => x).Result; --- > return Task<int>.Factory.StartNew (() => 42).Result; Как у C# с пробелами? Игнорирует? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mmoustaf 102 Жалоба Опубликовано: 11 л Эээ, кого распилить? Ну в смысле че именно происходит и в каком участке кода? Или ты вот прям так нулЁвое исключение кидаешь из любого участка кода и оно непонятно кем обрабатывается (или не обрабатывается, но приложение не падает)? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kluGe 1 Жалоба Опубликовано: 11 л Ну в смысле че именно происходит и в каком участке кода? Или ты вот прям так нулЁвое исключение кидаешь из любого участка кода и оно непонятно кем обрабатывается (или не обрабатывается, но приложение не падает)? Это в продолжение задачки Игоря. return Task<int>.Factory.StartNew(() => 42).Result; В статическом конструкторе такой вызов приводит к тому, что в StartNew передается указатель на метод который ещё не проинициализирован. По спецификации это должен быть указатель на null... но если передать туда null, то мы успешно падаем с NRE, а если передать туда лямбду то этого не происходит и запущенный Task становится вечным. Отбой! Помутнение нашло Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mmoustaf 102 Жалоба Опубликовано: 11 л Отбой! Помутнение нашло вот вот. Короче пора разделить тему. Занимательное программирование отдельно. Остальную фигню отдельно Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mmoustaf 102 Жалоба Опубликовано: 11 л А накидайте заданий со старых гуглолимпиад что ли? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Юра Бейс 220 Жалоба Опубликовано: 11 л Все дело в числе 42 - оно есть ответ на Главнейший Вопрос Вселенной, и компьютеры его не могут асилить. Попробуйте 41 или 43. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Гость Жалоба Опубликовано: 11 л Будет непонятно только программистам. Пользователи поймут. "ARMA 3 Field Guide"Список [клавиш управления] игры ARMA 3, текст - удалилПользователи (в основном - дети)) запомнят?Note: LMB stands for Left Mouse Button and RMB for Right Mouse Button. MWU for Mouse Wheel Up and MWD for Mouse Wheel Down. The rest should be self evident. [-] [backspace] [0-9] [backspace] [Left Ctrl] [RMB] [F2-F10] [-] [M] [F2-F10] [-] [Ctrl] [F2-F10] [F1][F12] [shift] [Left Ctrl + -] [F2] [Right Ctrl + F2] [HOLD RMB] [F2-F10] [-] [9] [shift][F#] [space] [MWD][MWU] [space] [N] [space] [RMB] [Right Ctrl + M] [LMB] [MWD] [space] [MWD] [FAK] [MWD] [space] [~] [5] [4] [Left Ctrl] [W], [A], [D] [C] [C] [W] [X] [Z] [W], [A], and [D] [M] [MWD] [Left Alt] [2x Left Alt] [Q] [E] [2x Q] [2x E] [Z], [Q], [E] [W], [A], and [D] [undefined] [X] or prone [Z] [X] [Z] [V] [undefined] [/][.] and [,] [undefined] [Caps Lock] [.] [Right Ctrl + M][2x K] [M] [MWU and MWD] [M] or [Escape] [J] [M] [J] [-] or [0] [8] [MWD] [W], [A], and [D] [E] and [Q] [Tab] [Left Ctrl + F] [‘] [RMB] [G] [Left Ctrl + G] [W] and [A] and [D] [Q] and [E] [NUM Enter] [Left Alt] [space] [MWD] [Q] [Q] [Z] [Mouse left][Mouse right] [W] [X] and [C] [MWD] [RMB] [LMB] [Num +] [Left Ctrl + RMB] [F] [MWD] [HOLD RMB][Tab] [N] [NUM .] [N] [Num Enter] [Left Alt] [MWD] [MWD] [Left Ctrl + G] [G] [MWD] [Num +][Num -] [Left Ctrl + RMB] [LMB] [Z] [F] [F] [L] [LMB][HOLD RMB] [HOLD RMB] [F] [RMB] [Page Up][Page Down] [LMB] [G] [Left Ctrl + G] [;] [MWD] [Right Ctrl +;] [RMB] [LMB] [HOLD RMB] [MWD] [2x Left Ctrl] [LMB] [L] [Page Up][Page Down] [X] [Z] [R] [space] [N] [Left Ctrl + G] [G] [Z] [RMB] [Page Up][Page Down] [HOLD RMB] [LMB] [Right Ctrl + ;] [;] [MWD] [LMB] [Page Up][Page Down] [RMB] [HOLD RMB] [NUM +] [NUM -] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
dobrobelko 145 Жалоба Опубликовано: 10 л Igor, union { struct { UINT32 matchCnt : 6; UINT32 unmatchCnt : 7; UINT32 weight : 7; UINT32 rephrCnt : 5; UINT32 synCnt : 6; UINT32 isInformative : 1; }; UINT32 normalized; }normalized; Под первые четыре битовых поля аллоцируется по одному байту, т.к. вместе они не влазят в базовый тип. synCnt и isInformative укладываются в 8 бит, т.е. размер структуры будет 4+1. В случае базового типа, вмещающего все битовые поля получим размер структуры 4 байта, чего видимо и хотел автор. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Avgoor 13 Жалоба Опубликовано: 10 л #include <iostream> #pragma pack (push, 1) union { struct { UCHAR matchCnt : 6; UCHAR unmatchCnt : 7; UCHAR weight : 7; UCHAR rephrCnt : 5; UCHAR synCnt : 6; UCHAR isInformative : 1; }; UINT32 normalized; }normalized; #pragma pack (pop) int main(int argc, char** argv) { size_t a = sizeof (normalized.normalized); // 4 size_t b = sizeof (normalized); // 5 std::cout<<"a="<<a<<"; b="<<b<<std::endl; return 0; } УМВР VS2010 union.zip вывод: a=4; b=4 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах