2011-07-08 109 views
1

当谈到关于创建单例实例中的竞争条件的单例和线程安全问题时,我们在讨论哪个线程?单例和线程安全

以此为例子,假设我有一个使用一个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的是它在谈论:

  • 当我打开MyApp.exe的一次, 再一次再次尝试让 都打开?
  • 还是说到MyApp产生的线程?如果MyApp确实 未产生线程会怎么样?

回答

1

在Windows threads exist solely within the scope of a process中,即应用程序的运行实例。因此thread safety意味着确保共享资源从给定进程内的多个线程顺序访问。

更一般地说,竞争条件是由于并发而发生的,而不管范围。例如,将共享资源暴露给外部进程的分布式应用程序,如果对该资源的访问没有得到适当的管理,仍然会受到竞争状况的影响。