Pull to refresh

Comments 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));
    }
}

пример совсем от балды - возьмем набор данных и применим параллельно несколько функций

просто надо отказаться от действий и мутирования общих данных в процессе обработки

и перейти к чистым функциям

Sign up to leave a comment.

Articles