Design Pattern Double Checked Locking 1 Design Pattern
Design Pattern Double Checked Locking 1
Design Pattern l Apresenta soluções para problemas que ocorrem repetidamente em nosso ambiente computacional 2
Design Pattern l Muitas soluções conhecidas funcionam bem para programas seqüenciais, mas contêm certas considerações que não se aplicam no contexto da concorrência. 3
Objetivo l Conhecer um dos mecanismos de controle de concorrência 4
Padrão de Singleton l Assegura que uma classe possua uma única instância e provê um ponto de acesso global a esta instância. – Ex: Spooler de impressão, Gerenciador de Janelas l Não funciona corretamente para sistemas multitarefa ou paralelos 5
Condição de Corrida l Múltiplos threads disputam a inicialização de uma seção crítica. – Seção crítica: enquanto um thread está sendo executado em uma seção crítica, nenhum outro thread poderá executar esta seção. 6
Padrão de Singleton Class Singleton { public; static Singleton_*instance { if (instance = = 0) //critical section instance_= new Singleton; return instance_; } void method (void); //outros métodos e membros omitidos private: static Singleton *instance_; }; 7
Mutex Class Singleton { Public: static Singleton_*instance { // Construtor do guard requisita // lock_automaticamente Guard<Mutex> guard (lock); // Apenas um thread na seção crítica por vez. if (instance = = 0) //critical section instance_= new Singleton; return instance_; // guard libera lock_automaticamente } private: static Mutex lock_; static Singleton *instance_; }; 8
Possível solução static Singleton_*instance { if (instance = = 0) { Guard<Mutex> guard (lock_); // apenas chega a este ponto se a instance_ // ainda não inicializada instance_= new Singleton; } return instance_; } 9
Double-Checked Locking static Singleton_*instance { // Primeira verificação if (instance = = 0) { //Assegura (construtor requisita lock_) Guard<Mutex> guard (lock_); // Dupla verificação_ if (instance = = 0) instance_= new Singleton; return instance_; //guard libera lock_ } Private: static Mutex lock_; static Singleton *instance_; }; 10
Aplicação A seção crítica é executada apenas uma vez l A aplicação possui uma ou mais seções críticas de código que devem ser executados seqüencialmente l Threads múltiplos podem tentar executar uma seção crítica simultaneamente l 11
Estrutura if (Flag = = False) { Mutex. acquire (); if (Flag = = False) { critical section; Flag = True; } Mutex. release (); } 12
Aplicação Verificar Flag Acquire Mutex Verificar Flag Mutex Seção Crítica Check false acquire Check false perform Critical Section Altera Flag set Release Mutex release 13
- Slides: 13