Функция, доступ к которой осуществляется несколькими потоками с параметром, переданным по ссылке

#vb.net #multithreading

#vb.net #многопоточность

Вопрос:

Я в vb.net и иметь функцию, к которой будут доступны несколько потоков. Все внутри функции использует локальные переменные. Однако каждый поток будет передавать свой собственный набор данных по ссылке.

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

Как я должен контролировать доступ / выполнение этой функции, чтобы убедиться, что она потокобезопасна? Спасибо.

Ответ №1:

Предполагая, что под ‘dataset’ вы подразумеваете System.Data.DataSet , если ваша функция выполняет только чтение из dataset, то вам в любом случае не нужна синхронизация, поскольку «Этот тип безопасен для многопоточных операций чтения» (от http://msdn.microsoft.com/en-us/library/system.data.dataset.aspx ).

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

Если вы изменяете данные и если разные потоки могут передавать ссылку на один и тот же набор данных, вам потребуется синхронизировать доступ к набору данных, используя Monitor ( SyncLock или lock на C #) или какой-либо другой метод синхронизации.

Комментарии:

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

2. Я беру System.Data.DataSet, который поступил, и перебираю каждую строку, заполняя локальные переменные, вызывая методы для получения дополнительных данных из базы данных и т.д. Набор данных может содержать несколько сотен строк, поэтому ожидается, что его обработка займет некоторое время.

3. @Scott: возможно, вам потребуется опубликовать какой-нибудь пример кода, чтобы было понятно, что происходит. Безусловно, существуют всевозможные проблемы — некоторые тонкие, некоторые очевидные — которые могут возникнуть при обработке потоков.