2016-01-15 1 views
0

Я вызываю большой метод через несколько потоков, и было довольно сложно предотвратить тупиковые ситуации и условия гонки с использованием synclock вокруг приращения глобального поля. Метод вызывает другие методы, и мне интересно, будут ли потоки участвовать в тех других методах, которые также скованы цепью (?).Предотвращение состояния гонки во время многопоточности

Мои мысли, что если я вместо этого создам экземпляр класса, запустите поток в конструкторе, а затем создайте экземпляр объектов и их методы всеми вызовами метода в первом методе, следует избегать условий гонки.

Созданный экземпляр класса также обладает своими методами, поэтому я считаю, что методы и вспомогательные методы в экземплярированном классе никогда не должны гоняться между собой. Поэтому я считаю, что я мог бы создавать экземпляр класса много раз, а не использовать потоки, и позволить GC догнать (может быть неэффективно?).

ответ

1

Возможно, это будет работать лучше вместо SyncLock:

 Interlocked.Increment(myGlobalVariable) 

Edit: Я не верю, что ваши теории о вводе методов в классах поможет предотвратить гонку данных. Не имеет значения, где определены методы, если они пытаются изменить одни и те же данные из разных потоков без эффективного метода синхронизации (например, мьютекса), тогда гонка данных является определенной возможностью.

+0

Еще один вопрос, какая техника наилучшей практики, если вы открываете, например. 1000, и все они запускают один и тот же метод (подпрограмма), и вам нужно увеличивать глобальные счетчики и обновлять глобальные массивы в рамках этого метода? Даже если вы можете получить глобальные элементы из метода, как большинство отправляет обновления вектора массива обратно в нечто глобальное из каждого потока? – wrtsvkrfm

+0

Я думаю, что 1000 потоков на моем ПК были бы очень плохой идеей, если это даже возможно. Сколько физических и логических процессоров имеет компьютер, на котором вы планируете запускать эту программу? –

+0

Я решил держать вещи под контролем с помощью ThreadPool. Кроме того, использование Synclock Me ... End Synclock работает практически без проблем. – wrtsvkrfm