Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 25.09.2013
Сообщений: 181

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

20.05.2014, 20:11. Показов 1971. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создал 12 потоков, а как-то не все ядра загружены.
Процессор i7-3930K.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
 
namespace ConsoleApplication1Thread
{
    class Program
    {
        static void Main(string[] args)
        {
            ThreadProc();
 
            Thread t2 = new Thread(ThreadProc);
            t2.Start();
 
            Thread t3 = new Thread(ThreadProc);
            t3.Start();
 
            Thread t4 = new Thread(ThreadProc);
            t4.Start();
 
            Thread t5 = new Thread(ThreadProc);
            t5.Start();
 
            Thread t6 = new Thread(ThreadProc);
            t6.Start();
 
 
            Thread t7 = new Thread(ThreadProc);
            t7.Start();
 
            Thread t8 = new Thread(ThreadProc);
            t8.Start();
 
 
            Thread t9 = new Thread(ThreadProc);
            t9.Start();
 
 
            Thread t10 = new Thread(ThreadProc);
            t10.Start();
 
 
            Thread t11 = new Thread(ThreadProc);
            t11.Start();
 
            Thread t12 = new Thread(ThreadProc);
            t12.Start();
        }
 
        static void ThreadProc()
        {
            while (true)
                Console.WriteLine("Поток");
        }
    }
}
Вопрос. Почему не все ядра загружены и как сделать так, чтобы отдельный поток подавался на отдельное ядро?
Миниатюры
Почему не все ядра загружены и, как сделать так, чтобы отдельный поток подавался на отдельное ядро?  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.05.2014, 20:11
Ответы с готовыми решениями:

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

Как сделать так, чтобы каждый поток работал с отдельным элементом массива
н-ое количество потоков (в данном случае 3) выполняют операцию с массивом. Как сделать так, чтобы каждый поток работал с отдельным...

Как сделать отдельный поток в C++?
Скажите как сделать отдельный поток в C++

11
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
20.05.2014, 20:26
C++
1
 SetThreadAffinityMask()
1
1 / 1 / 0
Регистрация: 25.09.2013
Сообщений: 181
20.05.2014, 21:57  [ТС]
WinApi предлагаете прикручивать? Средствами .NET не обойтись?
DWORD SetThreadAffinityMask (

HANDLE hThread, // дескриптор потока
DWORD_PTR dwThreadAffinityMask // маска родственности потока

);

А как тогда связать? Подскажете?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.05.2014, 22:16
Dimarik_1,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Runtime.InteropServices;
 
using System.Diagnostics;
using System.Threading;
namespace Tester
{
    class Program
    {
        [DllImport("kernel32")]
        static extern int GetCurrentThreadId();
        static void Main()
        {
            Thread t = new Thread(
            new ThreadStart(DoWork));
            t.Start();
            t.Join();
        }
        static void DoWork()
        {
            foreach(ProcessThread pt in Process.GetCurrentProcess().Threads)
            {
                int utid = GetCurrentThreadId();
                if (utid == pt.Id)
                {
                    pt.ProcessorAffinity = (IntPtr)(1); // Set affinity for this
                    thread to CPU #1
                    Console.WriteLine("Set");
                }
            }
        }
    }
}
0
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
20.05.2014, 22:22
http://msdn.microsoft.com/en-u... inity.aspx

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlThread)]
public class MyUtility
{
    [SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlThread)]
    public void PerformTask()
    {
        // Code that does not have thread affinity goes here. 
        //
        Thread.BeginThreadAffinity();
        // 
        // Code that has thread affinity goes here. 
        //
        Thread.EndThreadAffinity();
        // 
        // More code that does not have thread affinity.
    }
}
2
1 / 1 / 0
Регистрация: 25.09.2013
Сообщений: 181
21.05.2014, 20:15  [ТС]
Psilon, а ты можешь свой код прокомментировать? и Anklav, если можно?
0
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
21.05.2014, 22:35
Лучший ответ Сообщение было отмечено Dimarik_1 как решение

Решение

Dimarik_1, код между вызовами Begin и End будет привязан к потоку операционной системы. То что написал Psilon нужно обернуть этими методами.

Полный пример здесь: http://blog.rebuildall.net/201... ssor_cores
1
1 / 1 / 0
Регистрация: 25.09.2013
Сообщений: 181
22.05.2014, 10:07  [ТС]
Правильно ли я понимаю, что когда просто создаёшь потоки, система автоматически их не подаёт на разные ядра? Что она это делать не умеет и всегда это надо делать вручную. Или же в каких-то случаях это она умеет делать?
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
22.05.2014, 10:14
Dimarik_1, а с чего бы ей это делать? Количество потоков в системе и за несколько тысяч перевалить может, нагрузку и задачи каждого она знать не знает, так что если программист считает, что 4 потока каждый на своём ядре должны работать, то уже ручками их туда и отправляет.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.05.2014, 10:57
Dimarik_1, ядер у меня всего 8. Потков - сами смотрите. Так что все ядра по идее заняты. А о нагрузке система ничего сама сказать не может - она же не телепат и не пророк...
Миниатюры
Почему не все ядра загружены и, как сделать так, чтобы отдельный поток подавался на отдельное ядро?  
1
1 / 1 / 0
Регистрация: 25.09.2013
Сообщений: 181
22.05.2014, 15:26  [ТС]
Есть массив объектов. Можно ли как-нибудь было бы сделать так, чтобы все методы каждого объекта в массиве обрабатывались в отдельном потоке? Массив из 4-6 объектов
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
22.05.2014, 15:28
Dimarik_1, про PLINQ читайте...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.05.2014, 15:28
Помогаю со студенческими работами здесь

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

Как сделать так, чтобы поток ofstream НЕ открылся, или открылся неправильно?
Эта ситуация нужна мне для тестирования. Итак, файл "file.txt" вручную не удаляется. Не переименовывается. Если поток закрыть, как в...

Почему обновляется страница и как сделать так, чтобы она не обновлялась
Есть метод в контроле, в который передается или нет фаил. Когда я обращаюсь к этому методу и передаю модель без файла, всё нормально,...

Сделать так, чтобы только один поток обращался к PictureBox
Здравствуйте! Очень нужна ваша помощь. Я написала программу, где я запуская несколько потоков, и просто наблюдаю процесс, как эти потоки...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru