Нужны советы по безопасности потоков с использованием статических методов для «обработки» экземпляра класса - PullRequest
2 голосов
/ 30 июня 2011

Я недавно унаследовал систему, которая использует очень простой подход к обработке рабочих элементов, в основном, это делает их один за другим.Если честно, до недавнего времени это работало хорошо.Тем не менее, мы стремимся реализовать аналогичный процесс для другого типа рабочего элемента, и я изучал параллельную библиотеку задач и думаю, что она будет соответствовать всем требованиям.Тем не менее, у меня есть некоторые опасения по поводу безопасности потоков и, честно говоря, это область, в которой мне не хватает знаний, поэтому я задаю здесь только свой второй вопрос в надежде, что кто-то может дать мне несколько хороших баллов, так как я еще не нашелокончательный ответ да или нет для этого.

Итак, у нас есть класс WorkItem

public class WorkItem
{
    public int Id {get; set;}
    public string data { get; set;}
}

A List<WorkItem>, который будет обработан с использованием цикла Parallel.Foreach.

Parallel.Foreach вызовет закрытый метод, который, в свою очередь, вызовет статические методы из другой сборки;

//Windows service that will run the Parallel.Foreach
private int MainMethod(WorkItem item) 
{
    item.Data = Processor.ProcessWorkItemDataProcess1(item.data);
    item.Data = Processor.ProcessWorkItemDataProcess2(item.data);
    SendToWorkFlow(item);
}


public static class Processor
{
    public static string ProcessWorkItemDataProcess1(string data)
    {
    //Process it here
    return string
    }

    public static string ProcessWorkItemDataProcess2(string data)
    {
        //Process it here
        return string
    }
}

и так далее.Все эти методы имеют логику для обработки экземпляра WorkItem на разных этапах.После завершения MainMethod отправит обработанный WorkItem в систему Workflow.

Мы будем обрабатывать их партиями до 30, чтобы не перегружать другие системы.Мои опасения сводятся к тому, что 30 экземпляров WorkItem, имеющих доступ к одним и тем же статическим методам, могут вызвать проблемы с целостностью данных.Например, ProcessWorkItemDataProcess2 вызывается с WorkItem1.Data и впоследствии вызывается с WorkItem2.Data, и каким-то образом WorkItem2.Data возвращается, когда оно должно быть WorkItem1.Data

Все статические методы автономны впоскольку они определили логику и будут использовать только (в теории) WorkItem, с которым она была вызвана.Нет таких методов, как доступ к БД, доступ к файлам и т. Д.

Итак, надеюсь, это объясняет, что я делаю.Должен ли я иметь какие-либо проблемы?Если да, то решит ли потенциальные проблемы создание экземпляра класса Processor для каждого WorkItem?

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 30 июня 2011

Сценарий, который вы описываете, не звучит так, как будто имеет какие-то явные проблемы с многопоточностью. Ваши опасения по поводу того, что статический метод вызывается в двух разных потоках и что данные перепутаны, необоснованны, если только вы не пишете код, чтобы все перемешать. ;>

Поскольку методы являются статическими, им не нужно беспокоиться об экземпляре общего объекта. Это хорошо. Вы разделили работу на отдельные рабочие элементы. Это хорошо.

Вам необходимо проверить, чтобы убедиться, что ни один из статических методов не имеет доступа к какому-либо глобальному состоянию, например, статическим переменным или свойствам, или чтению из файла (одно и то же имя файла для нескольких рабочих элементов). Чтение глобального состояния не так важно, написание - то, что бросит рывок в работах.

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

2 голосов
/ 30 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...