Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 04.01.2015
Сообщений: 44

Как выполнить синхронизацию потоков

07.09.2017, 22:26. Показов 1135. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Получил задание с определенным условием, а именно "разделить операции на потоки и
синхронизацию потоков выполнять с помощью базовых механизмов платформы (без использования Task Parallel Library и concurrent-коллекций)". Как можно это реализовать? Откопал оператор lock и по нему короткий мануал и пример. Он годится?

Опыта программирования на C# нет, только Java и С++, но человеку надо сделать на C#.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.09.2017, 22:26
Ответы с готовыми решениями:

Как реализовать ПРАВИЛЬНУЮ синхронизацию потоков?
привет, возникла проблема при работе с многопоточностью, потоки пропускают случайные строчки, проблема возникла из-за кривой синхронизации....

Как выполнить цикл в несколько потоков с использованием Task?
Необходимо что бы в цикле for создавались потоки, которые выполняют функции, а все игнорируется... что же делать? private void...

Как обеспечить синхронизацию xchg для нескольких потоков?
Добрый вечер. Требуется небольшая консультация по мьютексам. Вообщем, вопрос в следующем. Есть код на ассемблере для захвата мьютекса, в...

4
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
08.09.2017, 07:06
Цитата Сообщение от tagboy Посмотреть сообщение
оператор lock
Оператор lock блокирует доступ к объекту остальным потокам и они ждут пока снимется блокировка , к примеру

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
List<int> list = new List<int>();
 
void Write()
{
   while (True)
   {
      lock(list)   { list.Add(1);  If(list.Count==5) list.Clear(); }     
    }
}
 
Thread t1 = new Thread(Write); //1 поток
Thread t2 = new Thread(Write); //2 поток
Thread t3 = new Thread(Write); //3 поток
t1.Start();
t2.Start();
t3.Start();
Если мы не заблокируем лист, то может возникнуть ситуация, что условие If(list.Count==5) не выполниться т.к. какой нибудь поток успеет сделать list.Add(1); и list.Count станет равен 6...

Пы сы, а еще есть потокобезопасные коллекции , там блокировки уже вшиты...
0
Футболист
 Аватар для Goal
533 / 435 / 142
Регистрация: 31.10.2011
Сообщений: 1,010
08.09.2017, 10:17
Цитата Сообщение от EVG-1980 Посмотреть сообщение
Пы сы, а еще есть потокобезопасные коллекции , там блокировки уже вшиты...
ConcurrentBag<T>

Цитата Сообщение от EVG-1980 Посмотреть сообщение
К примеру
нет!

Проведем работу над ошибками, и получим:

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
class Program
    {
        static void Main(string[] args)
        {
            var list = new List<int>();
            var objectToLock = new object();
 
            void Write()
            {
                while (true)
                {
                    lock (objectToLock)
                    {
                        list.Add(1);
                        if (list.Count == 5)
                            list.Clear();
                    }
                }
            }
 
            var t1 = new Thread(Write); //1 поток
            var t2 = new Thread(Write); //2 поток
            var t3 = new Thread(Write); //3 поток
            t1.Start();
            t2.Start();
            t3.Start();
        }
    }
полезная статья
0
0 / 0 / 0
Регистрация: 04.01.2015
Сообщений: 44
08.09.2017, 16:45  [ТС]
Спасибо, но ведь в примере кода используется ключевое слово Thread из System.Threading, которая входит в TPL. Задача у меня стоит в том, что "синхронизацию потоков выполнять с помощью базовых механизмов платформы (без использования TPL, Concurrent-коллекций)".
Допустим, необходимо разбить работу программы на несколько потоков, первый поток делает операцию рекурсивного обхода каталогов, второй поток выполняет определенные манипуляции с файлами, третий поток делает записи в БД результатов работы программы.
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
11.09.2017, 07:23
Цитата Сообщение от tagboy Посмотреть сообщение
Спасибо, но ведь в примере кода используется ключевое слово Thread из System.Threading, которая входит в TPL. Задача у меня стоит в том, что "синхронизацию потоков выполнять с помощью базовых механизмов платформы
Thread создает потоки (ведь как то, их нужно создавать), а синхронизация делается блокировками Lock

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
The lock statement is translated by C# 3.0 to the following:
 
var temp = obj;
 
Monitor.Enter(temp);
 
try
{
    // body
}
finally
{
    Monitor.Exit(temp);
}
 
In C# 4.0 this has changed and it is now generated as follows:
 
bool lockWasTaken = false;
var temp = obj;
try
{
    Monitor.Enter(temp, ref lockWasTaken);
    // body
}
finally
{
    if (lockWasTaken)
    {
        Monitor.Exit(temp); 
    }
}
Добавлено через 16 минут
Цитата Сообщение от tagboy Посмотреть сообщение
Допустим, необходимо разбить работу программы на несколько потоков, первый поток делает операцию рекурсивного обхода каталогов, второй поток выполняет определенные манипуляции с файлами, третий поток делает записи в БД результатов работы программы.
Так ты пытаешься избежать синхронизации, а тебе как я понял нужно задействовать синхронизацию
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.09.2017, 07:23
Помогаю со студенческими работами здесь

Задача на синхронизацию потоков
Подскажите как лучше сделать задачу, через таймеры или синхронизаторы. Если не сложно, напишите самый примитивный вариант решения. В...

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

Выполнить заполнение массива с использованием нескольких потоков
Требуется выполнить заполнение массива с использованием нескольких потоков. Соответственно есть класс MainWindow с объявленным массивом,...

Как отключить вертикальную синхронизацию?
Intel HD 4000 Здравствуйте, столкнулся с такой проблемой: не могу никак убрать лимит в 60 fps. Ноутбук asus ux31a, Kubuntu 13.04. ...

Потоки и их синхронизация. Как настроить синхронизацию?
Продолжение темы https://www.cyberforum.ru/delphi-networks/thread1116369.html#post5885169 Вот теперь дилемма с потоками. Решил что бы...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru