Что действительно произойдет, если я получу доступ к одиночному файлу в многопоточной программе? - PullRequest
0 голосов
/ 04 ноября 2011

РЕДАКТИРОВАТЬ: Хорошо, теперь работает.Я не знаю точно, что было худшей проблемой, но я не сделал некоторые блокировки, которые были необходимы, чтобы избежать условий гонки.Также я добавил ключевое слово «volatile» в объявление переменной экземпляра синглтона.

, если у меня запущено несколько потоков и в одном потоке я обращаюсь к синглтону (который, возможно, был создан в другом потоке)я получаю свежий "синглтон" с точки зрения того, что конструктор синглтона вызывается для каждого потока, который обращается к нему в своем пространстве памяти в первый раз?Я понял это правильно?

Проблема в моем приложении, у меня есть синглтон, созданный основным потоком.Если я затем вызываю Singleton.Instance.somemethod (...), я всегда получаю исключения нулевого указателя или пустые списки, даже если списки были созданы и заполнены в основном потоке?проблема, так что я могу использовать один и тот же экземпляр синглтона во всех запущенных потоках?Какой-то способ синхронизации всего экземпляра?

Спасибо.

РЕДАКТИРОВАТЬ: Извините, что не хватает действительно важной информации.Я использую C # и .NET Framework 4.0 под Visual Studio 2010 Professional.

Я создаю Singleton следующим образом:

 static readonly object _padlock = new object();

    public static StaticAnalyzer Instance
    {
        get
        {
            lock (_padlock)
            {
                if (_instance == null)
                {
                    _instance = new StaticAnalyzer();
                }
                return _instance;
            }
        }
    }

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

1 Ответ

1 голос
/ 04 ноября 2011

Нет, синглтон (если реализовано правильно ) будет только один для всех потоков. Как System.DBNull. В противном случае это не синглтон. У вас должна быть ошибка в вашем коде.

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