Многопоточные приложения связываются с одноядерным?

Сначала вы должны определить ширину вашего элемента. Например:

<div id="sampleDiv">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</div>

#sampleDiv{
  width: 80%;
  word-wrap:break-word;
}

, так что когда текст достигнет ширины элемента, он будет разбит на строки.

5
задан pablo 30 June 2009 в 01:10
поделиться

3 ответа

Не должно быть.

Есть несколько причин, по которым вы можете наблюдать такое поведение:

  1. Ваши потоки привязаны к вводу-выводу.

    В этом случае вы этого не сделаете. вижу много параллелизма, потому что все будет ждать на диске. Один диск по своей сути является последовательным.

  2. Степень детализации блокировки слишком мала

    Ваше приложение может тратить большую часть своего времени на получение блокировок, а не на выполнение логики вашего приложения. Это может значительно замедлить работу.

  3. Уровень детализации вашей блокировки слишком велик

    Если ваша блокировка недостаточно гранулярна, другие потоки могут проводить много времени в ожидании.

  4. У вас много конфликтов блокировки

    ] Все ваши потоки могут одновременно пытаться заблокировать одни и те же ресурсы, что делает их по своей природе последовательными.

  5. Возможно, вы неправильно разбиваете свои потоки.

    Вы можете запускать неправильные вещи в нескольких потоках. Например, если вы используете один поток для каждого соединения, возможно, вы не пользуетесь преимуществом доступного параллелизма в задаче, выполняемой в этом потоке. Попробуйте разделить эти задачи на части, которые могут выполняться параллельно.

  6. Ваш процесс может не иметь большого количества доступного параллелизма

    Возможно, вы просто делаете то, что на самом деле невозможно сделать параллельно.

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

10
ответ дан 18 December 2019 в 07:56
поделиться

Многопоточные приложения будут использовать все ваши ядра.

Я подозреваю, что ваше поведение вызвано следующим утверждением:

Канал TCP, который я использую, использует пул потоков в фоновом режиме.

TCP, как и большая часть кода сокетов / файлов / и т. Д., Имеет тенденцию использовать очень мало ЦП. Большую часть времени он проводит в ожидании, поэтому загрузка ЦП вашей программой, вероятно, никогда не будет резко возрастать. Попробуйте использовать пул потоков с тяжелыми вычислениями, и вы увидите скачок загрузки процессора почти до 100%.

6
ответ дан 18 December 2019 в 07:56
поделиться

Многопоточные приложения не обязательно должны быть привязаны к одному ядру. Вы можете проверить соответствие (на скольких ядрах он работает) потока с помощью ProcessThread.ProcessorAffinity . Я не уверен, что такое поведение по умолчанию, но вы можете изменить его программно, если вам нужно.

Вот пример того, как это сделать ( взято непосредственно из TechRepublic )

Console.WriteLine("Current ProcessorAffinity: {0}", 
                  Process.GetCurrentProcess().ProcessorAffinity);

Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)2;

Console.WriteLine("Current ProcessorAffinity: {0}", 
                  Process.GetCurrentProcess().ProcessorAffinity);

И вывод:

Current ProcessorAffinity: 3
Current ProcessorAffinity: 2

Код выше, сначала показано, что процесс выполняется на обоих ядрах. Затем он переходит на использование только второго ядра и показывает, что теперь он использует только второе ядро. Вы можете прочитать документацию .NET на ProcessorAffinity , чтобы узнать, что означают различные числа для соответствия.

4
ответ дан 18 December 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: