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

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

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

Author24 — интернет-сервис помощи студентам
Создал 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.05.2014, 20:11
Ответы с готовыми решениями:

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

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

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

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

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

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

);

А как тогда связать? Подскажете?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.05.2014, 22:16 4
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
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
20.05.2014, 22:22 5
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  [ТС] 6
Psilon, а ты можешь свой код прокомментировать? и Anklav, если можно?
0
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
21.05.2014, 22:35 7
Лучший ответ Сообщение было отмечено 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  [ТС] 8
Правильно ли я понимаю, что когда просто создаёшь потоки, система автоматически их не подаёт на разные ядра? Что она это делать не умеет и всегда это надо делать вручную. Или же в каких-то случаях это она умеет делать?
0
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
22.05.2014, 10:14 9
Dimarik_1, а с чего бы ей это делать? Количество потоков в системе и за несколько тысяч перевалить может, нагрузку и задачи каждого она знать не знает, так что если программист считает, что 4 потока каждый на своём ядре должны работать, то уже ручками их туда и отправляет.
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.05.2014, 10:57 10
Dimarik_1, ядер у меня всего 8. Потков - сами смотрите. Так что все ядра по идее заняты. А о нагрузке система ничего сама сказать не может - она же не телепат и не пророк...
Миниатюры
Почему не все ядра загружены и, как сделать так, чтобы отдельный поток подавался на отдельное ядро?  
1
1 / 1 / 0
Регистрация: 25.09.2013
Сообщений: 181
22.05.2014, 15:26  [ТС] 11
Есть массив объектов. Можно ли как-нибудь было бы сделать так, чтобы все методы каждого объекта в массиве обрабатывались в отдельном потоке? Массив из 4-6 объектов
0
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
22.05.2014, 15:28 12
Dimarik_1, про PLINQ читайте...
1
22.05.2014, 15:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2014, 15:28
Помогаю со студенческими работами здесь

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

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

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

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

Необходимо чтобы каждый поток (не файловый) писал данные в ОТДЕЛЬНОЕ ОКНО КОНСОЛИ
Друзья! Разбираюсь с библиотекой pthread, потоки-читатели выводят данные в одно окно консоли, очень...

Как сделать , чтобы при запуске access форма запускалась как отдельное приложение
Как сделать , чтобы при запуске access форма запускалась как отдельное приложение.Как сделать ,...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru