Os problemas podem ocorrer se não usarmos um qualificador volátil que inclua, quando a otimização estiver habilitada, o código pode não funcionar conforme o esperado. Quando as interrupções são utilizadas e habilitadas, o código não pode funcionar como planejado. Os dados são retidos apenas em armazenamento volátil enquanto a energia está ligada. Quando o suprimento é removido, ocorre a perda de dados.
No entanto, o armazenamento não volátil mantém os dados mesmo se a energia acabar. As informações do processo são armazenadas brevemente no armazenamento volátil, pois é consideravelmente mais rápido que o armazenamento não volátil. Ao contrário do armazenamento não volátil, o armazenamento volátil é mais adequado para proteger dados confidenciais. Isso ocorre porque os dados ficam inacessíveis quando a fonte de alimentação é desligada. O armazenamento volátil custa muito porque os sistemas de computador podem acomodar apenas alguns MB a alguns GB.”
Propriedades do Qualificador Volátil em C++
Os meios do qualificador volátil C++ serão demonstrados aqui. Quando declaramos uma variável, o qualificador “volátil” é aplicado. Serve como um lembrete para o compilador de que o valor pode variar a qualquer momento. Os voláteis possuem algumas das características listadas abaixo.
• A atribuição de memória não pode ser alterada com a palavra-chave volátil.
• As variáveis do registrador não podem ser armazenadas em cache.
• Em termos de atribuição, o valor não pode ser alterado.
Uso do Qualificador Volátil em C++
1. Apesar de seu código não modificar o valor da variável, ele pode fazê-lo. Como resultado, cada vez que o compilador verifica o estado da variável, ele não pode assumir que é o mesmo que o valor mais recente lido ou o valor mais recente armazenado; em vez disso, deve adquirir o valor da variável mais uma vez.
2. O compilador não é obrigado a eliminar o ato de armazenar um valor, pois é um “efeito colateral” que pode ser visto de fora e ocorre quando um valor é salvo em uma variável volátil. Por exemplo, se dois valores são colocados em uma linha, o compilador deve colocar o valor duas vezes.
Sintaxe do Qualificador Volátil em C++
# Volatile data_type variable_nameA palavra-chave volátil deve ser usada na declaração e o tipo de dados se refere a qualquer tipo de dados, incluindo double, float ou integer. Finalmente, escolhemos um nome para a variável. Podemos definir uma variável volátil usando qualquer um dos métodos, pois ambas as declarações são válidas.
Exemplo: o qualificador volátil é usado para identificar objetos que podem ser modificados por outros threads ou ações externas em C++
Se o objeto for alterado por um sinal externo ou por um procedimento que atua como uma interrupção, o valor alterado precisa ser recuperado da RAM porque o estado de cache não é mais apropriado nesse meio tempo. Como resultado, o compilador trata adequadamente o acesso a objetos voláteis.
#include#include
#include
usando std :: cout ;
usando std :: fim ;
usando std :: cerr ;
usando std :: comendo ;
volátil int segundos = 0 ;
vazio Atraso Cinco Segundos ( ) {
enquanto ( segundos < 3 ) {
você dorme ( 200000 ) ;
cerr << 'espera...' << fim ;
}
}
vazio Increment Seconds ( ) {
por ( int eu = 0 ; eu < 5 ; ++ eu ) {
dorme ( 1 ) ;
cerr << 'incrementado' << fim ;
segundos = segundos + 1 ;
}
}
int a Principal ( ) {
estrutura início do tempo { } ;
estrutura fim do tempo { } ;
padrão :: fio thread1 ;
thread1 = padrão :: fio ( Increment Seconds ) ;
Atraso Cinco Segundos ( ) ;
fio1. Junte ( ) ;
Retorna EXIT_SUCCESS ;
}
Para ilustrar o cenário potencial, usamos a palavra-chave volátil que tem a variável declarada como Segundos do tipo de dados “int” e atribuímos um valor 0 a ela. Em seguida, construímos duas funções: uma como “DelayFiveSeconds” que altera a variável inteira volátil global, e outra como “IncrementSeconds” que realiza a mesma avaliação dentro do loop while. Deve-se notar que este exemplo permite que o loop while tenha um loop sobre os segundos quando os segundos devem ser menores que 3.
Quando a condição atender, o bloco while será executado. Dentro do bloco while, invocamos o método unleep que imprime a declaração “waiting”. A função “IncrementSceonds” tem o loop for. Após a iteração, o método sleep é invocado, que imprime a instrução “increment” e incrementa a variável “seconds”. A execução inicial da função “IncrementSeconds” é feita por uma thread separada criada pela função main. O método “DelayFiveSeconds” é então chamado pela thread principal, entrando em um loop que não terminará se a variável seconds não passar do valor de 5.
Assim que o thread principal perceber que o valor da variável seconds foi alterado, ele retornará do método porque outro thread já começou a aumentá-lo simultaneamente.
Para executar o código da thread em C++, devemos usar o comando “g++ -pthread –o filename filename.cc”. Se você não implantar o “-pthread” no comando, há uma chance de uma exceção ser lançada pelo compilador. Como resultado, criamos efetivamente uma função de espera condicional que espera até que o objeto volátil seja alterado por uma força externa. É importante ter em mente que o bloco de código de atualização pode vir de uma seção de tradução diferente ou ação de sinal externo, mesmo que esse código ainda funcione da mesma forma se o qualificador volátil for removido e uma variável global convencional for utilizada.
Conclusão
Aqui, temos uma visão geral do Volátil em C++ junto com a sintaxe, o uso e os exemplos apropriados para uma melhor compreensão. Como o compilador não pode prever o valor, o volátil é crucial na programação C. O principal benefício de utilizar volátil é que seu valor pode variar sempre que um usuário solicitar que ele seja modificado ou quando algum outro encadeamento que utiliza a mesma variável estiver ativo.