Комментарии 7
синхронизированных многопоточных приложений
Про это написано.
безопасных
А вот про это нет :) Например можно было написать про:
Как обойтись без синхронизации в многопоточном приложении
Copy-on-write стуктуры данных
Mergeable Replicated Data Types и подобные попытки
Когда можно вообще забить на синхронизацию
Обзор возможных Concurrency control механизмов
Как гарантировать корректность многопоточного приложения
Какие варианты есть кроме блокировок
btw. Судя по обилию воды и вежливым оборотам, статья обработана ИИ по самое небалуй, не пора ли хабре заставлять делать дисклеймер об этом.
У Вас в разделе про deadlock, в пункте 2 Упорядочивайте блокировки, примеры местами перепутаны
Используйте функциональное программирование: запускайте обработку на копиях данных, а результаты склеивайте в конце.
for (int i = 0; i < 1000000; i++) { lock (lockObject) { counter++; } }
это, извините, ж-а
Привет, друг! Это был просто пример. Моей целью являлась демонстрация блокировки и управления потоками. Конечно, вариант с использованием функционального программирования лучше. Посмотрим, может добавлю пример с использованием функционального программирования. Если у тебя есть идеи как можно улучшить статью, я готов тебя выслушать :)
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
class Program
{
static void Main()
{
// Создание списка данных
List<int> data = new List<int> { 1, 2, 3, 4, 5 };
// Создание списка функций
List<Func<int, int>> functions = new List<Func<int, int>>
{
x => x * 2,
x => x + 1,
x => x * x
};
// Параллельная обработка каждого элемента данных с использованием ConcurrentBag
ConcurrentBag<int> resultList = new ConcurrentBag<int>();
Parallel.ForEach(data, d =>
{
List<int> results = functions.AsParallel().Select(f => f(d)).ToList();
results.ForEach(result => resultList.Add(result));
});
// Вывод результатов
Console.WriteLine("Результаты:");
resultList.ToList().ForEach(result => Console.WriteLine(result));
}
}
пример совсем от балды - возьмем набор данных и применим параллельно несколько функций
просто надо отказаться от действий и мутирования общих данных в процессе обработки
и перейти к чистым функциям
Разработка синхронизированных многопоточных приложений на C# и .NET