разделяю ваши чувства, переживал по поводу этой картинки с тех пор, как увидел ее )
поэтому спешу поделиться радостью: все закончится хорошо, вот пруф:
Вообще же подобную идею можно проследить еще у Свифта:
Длинная цитата
Со всех сторон каждой дощечки приклеено было по кусочку бумаги, и на этих бумажках были написаны все слова их языка в различных наклонениях, временах и падежах, но без всякого порядка. Профессор попросил меня быть внимательнее, так как он собирался пустить в ход свою машину. По его команде каждый ученик взялся за железную рукоятку, которые в числе сорока были вставлены по краям рамы, и быстро повернул ее, после чего расположение слов совершенно изменилось. Тогда профессор приказал тридцати шести ученикам медленно читать образовавшиеся строки в том порядке, в каком они разместились в раме; если случалось, что три или четыре слова составляли часть фразы, ее диктовали остальным четырем ученикам, исполнявшим роль писцов. Это упражнение было повторено три или четыре раза, и машина была так устроена, что после каждого оборота слова принимали все новое расположение, по мере того как квадратики переворачивались с одной стороны на другую.
Ученики занимались этими упражнениями по шесть часов в день, и профессор показал мне множество фолиантов, составленных из подобных отрывочных фраз; он намеревался связать их вместе и от этого богатого материала дать миру полный компендий всех искусств и наук; его работа могла бы быть, однако, облегчена и значительно ускорена, если бы удалось собрать фонд для сооружения пятисот таких станков в Лагадо и обязать руководителей объединить полученные ими коллекции.
Свифт Д. Путешествия Гулливера. Путешествие в Лапуту, Бальнибарби, Лаггнегг, Глаббдобдриб и Японию
Оригинал:
It's the challenge that's been staring us in the face for the past 30 years It has water, it has carbon
Перевод:
Это вызов, который глядит нам в глаза. За последние 30 лет мы выяснили — там есть вода, есть углерод
На самом деле:
Вызов глядит нам в глаза последние 30 лет. Там есть вода, углерод
Марс это место, которое мы можем достичь
Mars is a place we can settle
Марс это место, где мы можем обосноваться
глубиной 5000 километров.
5,000 kilometers long
длиной 5000 километров.
Mars is a dry frozen version of our home сovered in red dust and sand
Марс — сухой, замороженный, покрытый красной пылью и песком — кандидат на наш дом
Марс — это сухая и замороженная версия нашего дома, покрытая красной пылью и песком
И у нас будут «глаза» и «уши» на поверхности
We now have «eyes» and «ears» on the surface
Теперь у нас есть «глаза» и «уши» на поверхности
What's left after you go is the good you've left behind
То, что осталось с вами после того, как вы пошли, лучше, чем то, что вы оставили позади
Когда вы уйдете, останется то хорошее, что вы сами оставили
А вообще, конечно, разделяю восхищение новыми перспективами человечества :) И невообразимо радует возвращение романтики в науку, той романтики, с которой начинаются великие открытия.
Потоки будут спать, пока не появится новая задача в очереди.
Задача появилась — поток проснулся — выполнил очередную задачу — если есть еще задачи, выполнил их — опять заснул.
Пользователь класса просто добавляет потоки в очередь и устанавливает событие, которое разбудит рабочий поток.
Хотя я к Связному не имею отношения, попробую написать, что вы сделали не так.
Задача действительно решена неверно, у вас нет никакого ThreadPool'а.
Самая главная ошибка: каждая задача у вас выполняется в новом потоке: Thread lTaskThread =
new Thread(
() =>
{
// Выполнить задачу.
TaskBody();
Вместо этого необходимо при создании пула завести aConcurrentTaskNumber потоков, которые будут выполнять задачи. Поток sheduler'а в таком случае не нужен вообще, все постановки задач в очередь выполняются синхронно.
>Первоначально значение SyncBlock равно нулю. Однако в SyncBlock может хранится хеш-код объекта (при вызове метода GetHashCode), или номер записи syncblk,
вы путаете причину и следствие. не «SyncBlock может хранить хеш-код», а «Sync Index может использоваться в качестве хеш-кода»
>>Однако в SyncBlock может хранится хеш-код объекта (при вызове метода GetHashCode), или номер записи syncblk
«все смешалось в доме Облонских»
все совсем наоборот. для System.Object в CLR 1-2 в качестве хешкода использовался Sync index (поэтому вызов GetHashCode() на нем приводил к созданию Sync block'a)
подсчет длины строки также выполнен неверно. m_firstChar является первым элементом в последовательности символов, и поэтому присутствует один раз, а вы посчитали его дважды
на ошибку с привязкой value types к стеку вам уже указали
Похоже, других вариантов уже не будет, поэтому вот мое решение. Удивительно, что никто не предложил.
Поскольку типа С до «before static ctor» в домене просто нет, то и статический конструктор его не может вызваться.
Этот же способ (с дополнением одной строчки) покрывает более правильный случай, указанный habrahabr.ru/blogs/net/113543/#comment_3650548
using System;
class C{
static C() { Console.WriteLine(«from static ctor»); }
}
class App
{
static void Main()
{
Console.WriteLine(«before static ctor»);
var t = typeof(C<>).MakeGenericType(new Type[] { typeof(string) } );
object o = Activator.CreateInstance(t);
Console.WriteLine(«after static ctor»);
}
}
поэтому спешу поделиться радостью: все закончится хорошо, вот пруф:
источник habrahabr.ru/post/159713/#comment_5476039
Ученики занимались этими упражнениями по шесть часов в день, и профессор показал мне множество фолиантов, составленных из подобных отрывочных фраз; он намеревался связать их вместе и от этого богатого материала дать миру полный компендий всех искусств и наук; его работа могла бы быть, однако, облегчена и значительно ускорена, если бы удалось собрать фонд для сооружения пятисот таких станков в Лагадо и обязать руководителей объединить полученные ими коллекции.
Свифт Д. Путешествия Гулливера. Путешествие в Лапуту, Бальнибарби, Лаггнегг, Глаббдобдриб и Японию
Оригинал:
It's the challenge that's been staring us in the face for the past 30 years It has water, it has carbon
Перевод:
Это вызов, который глядит нам в глаза. За последние 30 лет мы выяснили — там есть вода, есть углерод
На самом деле:
Вызов глядит нам в глаза последние 30 лет. Там есть вода, углерод
Марс это место, которое мы можем достичь
Mars is a place we can settle
Марс это место, где мы можем обосноваться
глубиной 5000 километров.
5,000 kilometers long
длиной 5000 километров.
возможны загрязнения
Back-contamination
заражение внеземными микроорганизмами
Mars is a dry frozen version of our home сovered in red dust and sand
Марс — сухой, замороженный, покрытый красной пылью и песком — кандидат на наш дом
Марс — это сухая и замороженная версия нашего дома, покрытая красной пылью и песком
И у нас будут «глаза» и «уши» на поверхности
We now have «eyes» and «ears» on the surface
Теперь у нас есть «глаза» и «уши» на поверхности
What's left after you go is the good you've left behind
То, что осталось с вами после того, как вы пошли, лучше, чем то, что вы оставили позади
Когда вы уйдете, останется то хорошее, что вы сами оставили
А вообще, конечно, разделяю восхищение новыми перспективами человечества :) И невообразимо радует возвращение романтики в науку, той романтики, с которой начинаются великие открытия.
Задача появилась — поток проснулся — выполнил очередную задачу — если есть еще задачи, выполнил их — опять заснул.
Пользователь класса просто добавляет потоки в очередь и устанавливает событие, которое разбудит рабочий поток.
Задача действительно решена неверно, у вас нет никакого ThreadPool'а.
Самая главная ошибка: каждая задача у вас выполняется в новом потоке:
Thread lTaskThread =
new Thread(
() =>
{
// Выполнить задачу.
TaskBody();
Вместо этого необходимо при создании пула завести aConcurrentTaskNumber потоков, которые будут выполнять задачи. Поток sheduler'а в таком случае не нужен вообще, все постановки задач в очередь выполняются синхронно.
Если бы вы были знакомы с концепцией .NET ThreadPool (и вообще паттерном thread pool), проблемы бы не было.
добавлены в С с 99 года, в С++ с 2011
ru.wikipedia.org/wiki/Вариативный_макрос
картинка просто не соотвествует действительности
>Первоначально значение SyncBlock равно нулю. Однако в SyncBlock может хранится хеш-код объекта (при вызове метода GetHashCode), или номер записи syncblk,
вы путаете причину и следствие. не «SyncBlock может хранить хеш-код», а «Sync Index может использоваться в качестве хеш-кода»
>это не является ошибкой. см. мой коммент выше.
в той формулировке, как это сделано в статье, именно что ошибка. а вашим комментариям, к сожалению, доверять нельзя
почиайте Липперта что ли:
blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx
blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx
>вообще-то посчитано правильно. m_firstChar является отдельным полем класса
>тогда при присваивании ей значения char копируется из массива символов.
возьмите отладчик и посмотрите побайтно, что в строке есть и чего там нет
ссылочные объекты занимают 4 байта (на машине соответствующей разрядности) и вполне попадают в Object fields. незачем пихать в схему лишнюю сущность
тот же Рихтер рисует только Type object ptr и Sync index: www.rvenables.com/linkjackandsufferaccidentaldroptable/clr_via_csharp_f4.9.png
>>Однако в SyncBlock может хранится хеш-код объекта (при вызове метода GetHashCode), или номер записи syncblk
«все смешалось в доме Облонских»
все совсем наоборот. для System.Object в CLR 1-2 в качестве хешкода использовался Sync index (поэтому вызов GetHashCode() на нем приводил к созданию Sync block'a)
подсчет длины строки также выполнен неверно. m_firstChar является первым элементом в последовательности символов, и поэтому присутствует один раз, а вы посчитали его дважды
на ошибку с привязкой value types к стеку вам уже указали
несколько раз перечитал, не понял, что это
и почему его нет в общей сумме?
антология — это «избранное», если угодно, очень часто «лучшее»
полное собрание никак не может быть антологией
class C<T>{
static C() { Console.WriteLine(«from static ctor»); }
}
Поскольку типа С до «before static ctor» в домене просто нет, то и статический конструктор его не может вызваться.
Этот же способ (с дополнением одной строчки) покрывает более правильный случай, указанный habrahabr.ru/blogs/net/113543/#comment_3650548
using System;
class C{
static C() { Console.WriteLine(«from static ctor»); }
}
class App
{
static void Main()
{
Console.WriteLine(«before static ctor»);
var t = typeof(C<>).MakeGenericType(new Type[] { typeof(string) } );
object o = Activator.CreateInstance(t);
Console.WriteLine(«after static ctor»);
}
}
public static object a = new A();
поскольку А приватно определен, наружу отдавать его нельзя