1 / 1 / 1
Регистрация: 16.11.2014
Сообщений: 21
1

Необходимо синхронизировать потоки (написать свой ThreadPool)

10.12.2014, 01:35. Показов 974. Ответов 1
Метки нет (Все метки)

Надо написать свой ThreadPool. Идея начальная проста:
есть очередь задач, которая подаётся на съедение потокам, всё инкапсулируется в классе MyThreadPool, который имеет метод добавление в очередь, из него должен поступать сигнал, что элемент добавлен
C#
1
2
3
4
5
6
7
8
9
public void EndMyThreadPool()
        {
            foreach(MyThread a in mythreads)
            {
                a.EndThreads();//это не так важно, в семантике можно не рассматривать
                Console.WriteLine("поток корректно остановлен, его задача выполнена!!");
            }
            Console.WriteLine("Все потоки успешно остановлены, после выполнения задач!!! ");
        }
сам метод исполнения задачи, для одного потока
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
void Execute()
        {
            while (!end)//можно понимать, что здесь просто true, так как к вопросу это не имеет отношения
            {
                Console.WriteLine("Я ищу еду");
                wait.WaitOne();
                if (queue_of_task.Count > 0)
                {
                    wait.ReleaseMutex();
                    Console.WriteLine("еда есть");
                    //wait.WaitOne();
                    Console.WriteLine("можно поесть");
                    wait.WaitOne();
                    var task = queue_of_task.Dequeue();
                    wait.ReleaseMutex();
                    Console.WriteLine("количство задач:  " + queue_of_task.Count);
                    Thread.Sleep(100);
                   // wait.ReleaseMutex();
                    task.Start();
                   // wait.ReleaseMutex();
                    Console.WriteLine("Задача выполнена!");
                }
                else
                {
                    wait.ReleaseMutex();
                    Console.WriteLine("Я хочу есть");
                    wait.WaitOne();
                    /*while (queue_of_task.Count <= 0)
                    {//всё работает с этим закомент циклом, но надо, чтобы поступал сигнал, а не этот ужас
                    }*/
                }
            }
        }
перепробовал кучу средств синхронизации, помогите советом.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2014, 01:35
Ответы с готовыми решениями:

Свой ThreadPool
Стоит довольно забавная задача. Допустим запустился поток №1 , через некоторое время создался...

Потоки, мультипоточность Task or Async/Await or ThreadPool?
Здравствуйте форумчане. Я очень нуждаюсь в вашей помощи. Я реализовываю парсер с одного довольно...

ThreadPool - не все потоки учитываются при использовании в цикле
При выполнении ThreadPool в цикле, после определённого количества циклов он зависает на строке...

Как в ThreadPool проверить, что все потоки завершены
Как можно проверить, что все потоки завершили свою работу в ThreadPool, а после выполнить...

1
1 / 1 / 1
Регистрация: 16.11.2014
Сообщений: 21
11.12.2014, 10:16  [ТС] 2
извините, вот метод добавления
C#
1
2
3
4
5
6
7
8
9
public void PutInQueue<T>(T task) where T : IStart
        {
            wait.WaitOne();
            //b.WaitOne();
            queue_of_task.Enqueue(task);
            a.Set();
            Console.WriteLine("Сигнал дан!");
            wait.ReleaseMutex();
        }
это метод остановки(ночью писал, сильно тупил
C#
1
2
3
4
5
6
7
8
9
        public void EndMyThreadPool()
        {
            foreach(MyThread a in mythreads)
            {
                a.EndThreads();
                Console.WriteLine("поток корректно остановлен, его задача выполнена!!");
            }
            Console.WriteLine("Все потоки успешно остановлены, после выполнения задач!!! ");
        }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2014, 10:16
Помогаю со студенческими работами здесь

Синхронизировать потоки
Имеется форма и консольное приложение.Имеется 3 потока, нужно синхронизировать их работу между...

Как синхронизировать потоки?
Есть метод с параметрами, данный метод будет использоваться в трех разных потоках. Параметры...

Как синхронизировать потоки?
Разбираюсь с legacy-кодом. Наткнулся на такой фрагмент в фоновом потоке: private void...

Синхронизировать потоки в следующем виде
Помогите пожалуйста решить задачу! На форме есть кнопка и тестовое поле, по нажатию на кнопку нужно...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru