2016-04-20 2 views
0

Я кодирую некоторый простой диспетчер графа, и я решил использовать фабричный шаблон для создания ребер для моего графика. Я только начинаю изучать шаблоны дизайна и темы.Threadsafe factory pattern

Я создал фабрику с возвращением некоторые объекты (ребра), метод создания, код:

public Edge<T> CreateEdge(Vertex<T> firstVertex, Vertex<T> secondVertex) 
{ 
    var edge = new Edge<T>(firstVertex, secondVertex, _nextIndex); 

    _nextIndex++; 

    return edge; 
} 

А вот моя проблема. Что, если эта фабрика будет разделяться несколькими потоками, возможно, что возвратите несколько ребер с одним индексом.

Какое оптимальное решение этой проблемы?
Должен ли я использовать блокировку или некоторые мьютексы?
Или это вина моих плохих классов дизайна, использование фабрики?

Редактировать # 1: Изменить IncreaseIndex() -> _nextIndex ++; ошибка при написании.

+0

Is NextIndex недвижимость? Это то, что я бы предположил, основываясь на имени, но просто хочу быть уверенным. – konkked

+0

Да, моя ошибка при вводе текста. Исправлено –

+1

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

ответ

3

Вы можете использовать:

long _index; 

var nextIndex = Interlocked.Increment(ref _index); 

Это обеспечит ваш индекс остается уникальным по потокам. Использование простого поля здесь имеет наибольший смысл, поскольку оно является свойством вашего класса фабрики.

+0

Спасибо за ваш ответ. Это решает мою проблему. Я никогда не использовал/не слышал до класса Interlocked. Я думаю, что это может быть очень полезно сейчас и в будущем :) –

1

Альтернативой было бы обернуть функциональность IncreaseIndex в замке, или вы могли бы передать управление индексами в одноэлементный (Jon Skeet's Singleton implementation).

+0

Спасибо за ваш ответ. Я рассматривал использование singleton, но он ограничивает меня, потому что это может произойти, ситуация, когда у меня есть несколько графиков, и у каждого должен быть свой собственный завод. –