Singleton и безопасность потока - PullRequest
1 голос
/ 08 июля 2011

Говоря о синглетонах и проблемах безопасности потоков, связанных с условиями гонки при создании экземпляра синглтона, о каком потоке мы говорим?

Используя это в качестве примера, предположим, что у меня есть MyApp, который использует Singleton

class MyApp
{
    MySingleton oneAndOnly;

    int main() // application entry point
    {
        oneAndOnly = MySingleton::GetInstance();
    }

    void SpawnThreads()
    {
        for(int i = 0; i < 100; i++)
        {
              Thread spawn = new Thread(new ThreadStart(JustDoIt));
              spawn.Start();
        }
    }

    void JustDoIt()
    {
        WaitRandomAmountOfTime(); // Wait to induce race condition (maybe?) for next line.

        MySingleton localInstance = MySingleton::GetInstance();
        localInstance.DoSomething();
    }
}

Речь идет о:

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

1 Ответ

1 голос
/ 08 июля 2011

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

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

...