Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
2 / 2 / 3
Регистрация: 19.06.2011
Сообщений: 82
1

Оператор lock и класс Monitor

23.11.2014, 12:37. Просмотров 3113. Ответов 10
Метки нет (Все метки)


Здравствуйте, у меня такая проблема(задача на картинке) мой код прикреплен, надо правильно использовать оператор lock из класса Monitor(как на задании написано) у меня не получается
тема синхронизации потоков

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
61
62
63
64
65
66
67
68
69
70
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        static int[] AArray;
 
        public class Mas
        { public int[] AArray2;}
 
        static void Min(object o)
        {
            Mas d = (Mas)o;
            int minValue = d.AArray2.Min();
            Console.WriteLine("Миниимальное значение: " + minValue);
        }
 
        static void Max(object o1)
        {
            Mas d1 = (Mas)o1;
            int maxValue = d1.AArray2.Max();
            Console.WriteLine("Максимальное значение: " + maxValue);
        }
 
 
        static int[]Brray()
        {
            Random rand = new Random();
 
            int[] AArray = new int[100];
            for (int i = 0; i < 100; i++)
            {
                AArray[i] = rand.Next(-50, 50);
                Console.WriteLine("{0} элемент: {1}", i, AArray[i]);
 
            }
            return AArray;
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Задание 3.а");
            Console.WriteLine("100 элементов массива:");
 
            
 
            var d = new Mas();
            var d1 = new Mas();
 
            Brray();
            d.AArray2 = AArray;
            d1.AArray2 = AArray;
 
            Thread thread1 = new Thread(Min);
            Thread thread2 = new Thread(Max);
 
            thread1.Start();
            Console.WriteLine("Работа потока 1 завершена");
            thread2.Start();
            Console.WriteLine("Работа потока 2 завершена");
 
 
            Console.ReadLine();
        }
    }
}
0
Миниатюры
Оператор lock и класс Monitor  
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.11.2014, 12:37
Ответы с готовыми решениями:

Многопоточность, оператор Lock
У одном обучающем видеоролике, парень обьясняет что чтобы по частям среда не читала код из потока,...

PNP-Monitor Lock (Standart) отключает регулировку яркости
Ноутбук Acer Nitro 5. Решил сменить яркость монитора. И сделать это не смог, т.к. кнопки Fn+ не...

Acer aspire 5552G-N974G64Mikk Проблема с Caps Lock, Num Lock, Scroll Lock
Вообщем у меня такая же проблемма https://www.cyberforum.ru/notebooks/thread552722.html ...

Вывести на экран в символическом виде состояние NUM LOCK, CAPS LOCK и SCROLL LOCK
Помогите решить задачку на турбо си Выводить на экран в символическом виде состояние NUM LOCK,...

10
2141 / 1278 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
23.11.2014, 13:21 2
Цитата Сообщение от Gypka[for]mozga Посмотреть сообщение
надо правильно использовать оператор lock из класса Monitor(как на задании написано) у меня не получается
задание внимательней прочитайте.. lock это оператор, но не из класса Monitor
http://msdn.microsoft.com/ru-r... ehkcz.aspx

он блокирует одновременный доступ к блоку кода (который пиштся в фигурных скобках) из разных потоков
0
45 / 45 / 32
Регистрация: 15.04.2011
Сообщений: 187
23.11.2014, 13:25 3
Gypka[for]mozga, так же я не вполне понял зачем передавать массив параметром в поток если он объявлен как статический в классе...
0
Модератор
Эксперт .NET
5304 / 4100 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
23.11.2014, 13:33 4
Лучший ответ Сообщение было отмечено Metall_Version как решение

Решение

Задания, как мне видится, мутное... Зачем для синхронизации использовать lock (или его аналог Monitor)... Ну залочим мы цикл вычислений каждого из значений, а смысл... Элементы массива не изменяются, следовательно, все вычисления гарантированно потокобезопасны... Так что оптимальнее, как я считаю, использовать потоковую синхронизацию. Вот примерный набросок для вашей задачи...
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Threading;
using System.Threading.Tasks;
 
namespace ParallelThreads_Test {
    class Program {
        static int[] myArray = new int[100];
        static EventWaitHandle handle = new AutoResetEvent(false);
 
        static void Main(string[] args) {
            Console.WriteLine("Main() started in Thread: {0}", Thread.CurrentThread.ManagedThreadId);
            Random r = new Random();
 
            myArray = Enumerable.Range(0, 100).Select(i => r.Next(-50, 51)).ToArray();
            PrintArray(myArray);
 
            Parallel.Invoke(
                new Action(() => { new Thread(() => { GetMinInt(myArray); }).Start(); }),
                new Action(() => { new Thread(() => { GetMaxInt(myArray); }).Start(); }));
            Console.ReadLine();
        }
        static void GetMinInt(int[] arr) {
            Console.WriteLine("GetMinInt() started in Thread: {0}", Thread.CurrentThread.ManagedThreadId);
            int min = 0;
            foreach (int i in arr) {
                min = (min > i) ? i : min;
            }
            handle.WaitOne();
            Console.WriteLine("Minimal value is: {0}", min);
        }
        static void GetMaxInt(int[] arr) {
            Console.WriteLine("GetMaxInt() started in Thread: {0}", Thread.CurrentThread.ManagedThreadId);
            int max = 0;
            foreach (int i in arr) {
                max = (max < i) ? i : max;
            }
            Console.WriteLine("Maximal value is: {0}", max);
            handle.Set();
        }
    
 
        static void PrintArray(int[] arr) {
            foreach (int i in arr) {
                Console.WriteLine("Item: {0}", i);
            }
        }
    }
}
2
45 / 45 / 32
Регистрация: 15.04.2011
Сообщений: 187
23.11.2014, 13:36 5
Gypka[for]mozga,
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication1
{
   
    class Program
    {
        static int[] array = new int[100];
        static public void Main(string[] args)
        {
            Random rnd = new Random();
            for (int i=0;i<100;i++)
                array[i] = rnd.Next(-50,50);
 
            Thread findMinThread = new Thread(FindMinThread);
            findMinThread.Start(array);
            Thread findMaxThread = new Thread(FindMaxThread);
            findMaxThread.Start(array);
            findMinThread.Join();
            Console.WriteLine("Поток поиска минимального значения завершен!");
            findMaxThread.Join();
            Console.WriteLine("Поток поиска максимального значения завершен!");
            Console.ReadKey();
        }
        static void PrintArray()
        {
            for (int i = 0; i < 100; i++)
                Console.WriteLine(array[i]);
            
        }
        static void FindMinThread(object o)
        {
            Monitor.Enter(array);
                Console.WriteLine("Миниимальное значение: " + array.Min());
            Monitor.Exit(array);
        }
        static void FindMaxThread(object o)
        {
            Console.WriteLine("Максимальное значение: " + array.Max());
        }
    }
}
Вот еще вариант с Монитором, хотя как верно заметили выше - задание мутное=)
0
2141 / 1278 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
23.11.2014, 13:43 6
Цитата Сообщение от drondez Посмотреть сообщение
хотя как верно заметили выше - задание мутное=)
почти все задания которые появляются в этом разделе очень "мутные" , как и в целом система образования программистов..
0
45 / 45 / 32
Регистрация: 15.04.2011
Сообщений: 187
23.11.2014, 13:46 7
insite2012, Тебе кстати не кажется что использование лямбд и прочих прелестей несколько не соответствует разделу?)
0
2141 / 1278 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
23.11.2014, 13:50 8
insite2012, небольшая оптимизация кода
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        private static void Main(string[] args)
        {
            Console.WriteLine("Main() started in Thread: {0}", Thread.CurrentThread.ManagedThreadId);
            Random r = new Random();
 
            myArray = Enumerable.Range(0, 100).Select(i => r.Next(-50, 51)).ToArray();
            PrintArray(myArray);
 
            Parallel.Invoke(
                (() => new Thread(() => GetMinInt(myArray)).Start()),
                (() => new Thread(() => GetMaxInt(myArray)).Start()));
            Console.ReadLine();
        }
2
Модератор
Эксперт .NET
5304 / 4100 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
23.11.2014, 13:51 9
Цитата Сообщение от drondez Посмотреть сообщение
Тебе кстати не кажется что использование лямбд и прочих прелестей несколько не соответствует разделу?)
Это проблеме тех, кто создает темы. Я пишу как считаю нужным (хотя каждую лямбду и анонимный делегат я без труда разверну в полные виды), просто мне так удобнее. Если кто-то не знает этого ,или они этого еще не проходили - это не моя проблема.

Добавлено через 55 секунд
Цитата Сообщение от Metall_Version Посмотреть сообщение
небольшая оптимизация кода
Metall_Version, можно и так))) Смысл останется неизменным)))
0
2 / 2 / 3
Регистрация: 19.06.2011
Сообщений: 82
23.11.2014, 14:27  [ТС] 10
Благодарю всех за оперативную помощь)
0
2262 / 1720 / 511
Регистрация: 02.08.2011
Сообщений: 4,912
23.11.2014, 18:10 11
insite2012, небольшая корректировка:
C#
1
2
3
Parallel.Invoke(
                new Action(() => { new Thread(() => { GetMinInt(myArray); }).Start(); }),
                new Action(() => { new Thread(() => { GetMaxInt(myArray); }).Start(); }));
Получилась 'матрешка' - создалось два лишних потока.
Проще ведь вот так:
C#
1
2
3
4
5
6
7
8
Parallel.Invoke(
                () =>
                {
                   GetMinInt(myArray);
                }, () =>
                {
                   GetMaxInt(myArray);
                });
Добавлено через 1 минуту
Создание потоков - дорогостоящая операция, ну вы и сами это знаете.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2014, 18:10

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

Клавиатура мигает всеми тремя индикаторами Caps Lock, Scroll Lock и Num Lock и соответственно не работает!
Здравствуйте парни и девушки! Столкнулся с такой проблемой! Имеется клавиатура Genius Ergomedia...

Работа с клавиатурой (клавиши num lock, caps lock, scroll lock)
определить состояние статуса клавиш &quot; num lock, caps lock,scroll lock &quot; с отображением и их...

Для чего нужен оператор lock?
для чего нужен оператор lock? в смысле я уже загуглил - он заставляет код выполняться синхронно, но...

Как использовать оператор lock в статических методах
using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Почему оператор lock () предназначен только для ссылочных типов?
Почему оператор lock () предназначен для приема только параметров ссылочного типа?

Синхронизировать три нити одного процесса с помощью оператор lock
Синхронизировать три нити одного процесса с помощью оператор lock. Каждая нить поочередно формирует...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.