Skip to main content

Volatile Qualifier in C : Explained by Example

                     Volatie qualifier can be used by keyword volatile in C/C++. You can define a variable as volatile by adding volatile qualifier just before data type.eg

volatile int a; 

Volatile specifies a variable whose value may be changed by processes outside the current program. The meaning of outside of the current program may be Operating System or separate thread in case of multi threading processing.
When we defines a variable as volatile, It does two things

1) The system always reads the current value of a volatile object from the memory location rather than keeping its value in temporary register at the point it is requested, even if a previous instruction asked for a value from the same object.

2) It stops Compiler to perform some optimizations. As we know that Compiler do some kind of optimizations on the source code before compilation. Below examples explain how a volatile qualifier affects the Compiler optimizations.

Suppose There is the following Source Code:

test.c

int main()
{
 int a =10;
 if(a == 10)
 {
  printf("Yes\n");
 }
 else
 {
  printf("No\n");
 }
}

Source code after compiler optimizations

test-optimized.c

int main()
{
 int a =10;
 if(1)
 {
  printf("Yes\n");
 }
 else
 {
  printf("No\n");
 }
}

As we can see that in optimized code the condition within IF statement changed by 1(always true),The condition always evaluated as true because value of a never changed within program. So the output of the program will never change whether variable a changes his value outside of the program.
Now try the same code snippet with volatile qualifier.

volatile-test.c

int main()
{
 volatile int a =10;
 if(a == 10)
 {
  printf("Yes\n");
 }
 else
 {
  printf("No\n");
 }
}

volatile-test-optimized.c

int main()
{
 int a =10;
 if(a == 10)
 {
  printf("Yes\n");
 }
 else
 {
  printf("No\n");
 }
}

Now We defined the variable as volatile So we can see that optimized code does not replace the condition within IF statement. The program now expecting the value of variable a can be change by outside of the program. The output of program will change if the value of variable a modified by Operating System or some other threads.




Note :- Above optimized code are not the exact code optimized by complier. It is only intended to explaining the concept.


Comments

Popular posts from this blog

How to Create a Namespace in Aerospike Database

                      T his post is about creating a namespace in Aerospike. I could not find any concrete method to create a namespace like create database in MySQL and MongoDB. So I am suggesting a way to create a namespace in Aerospike Database. Step-1: Locate config file aerospike.conf and open it in your favorite editor and make sure you have permission to modify the file. In my system the path of file /etc/aerospike/aerospike.conf (Default in Ubuntu). Here the content of the file. # Aerospike database configuration file. service { user root group root paxos-single-replica-limit 1 # Number of nodes where the replica pidfile /var/run/aerospike/asd.pid service-threads 4 transaction-queues 4 transaction-threads-per-queue 4 proto-fd-max 15000 } logging { # Log file must be an absolute path. file /var/log/aerospike/aerospike.log { context any info } } network { service { address any port 3000 } heartbeat { mode multicast address 239.1.99.222 p

java.lang.IllegalArgumentException: Could not instantiate implementation: org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager

If you are trying to get started with Janus Graph with Apache Cassandra. You may get the following error. Caused by: org.janusgraph.diskstorage.TemporaryBackendException: Temporary failure in storage backend at org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager.getCassandraPartitioner(CassandraThriftStoreManager.java:219) ~[janusgraph-cassandra-0.2.0.jar:na] at org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager.<init>(CassandraThriftStoreManager.java:198) ~[janusgraph-cassandra-0.2.0.jar:na] ... 48 common frames omitted Caused by: org.apache.thrift.transport.TTransportException: java.net.ConnectException: Connection refused (Connection refused) at org.apache.thrift.transport.TSocket.open(TSocket.java:187) ~[libthrift-0.9.2.jar:0.9.2] at org.apache.thrift.transport.TFramedTransport.open(TFramedTransport.java:81) ~[libthrift-0.9.2.jar:0.9.2] at org.janusgraph.diskstorage.cassandra.thrift.thriftpool.CTConnectionFactory.makeR

com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server

If you are trying to connect Mongo DB Server and it insanely throwing following error. com.mongodb.MongoTimeoutException : Timed out after 1000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=192.168.1.10:27010, type=UNKNOWN, state=CONNECTING, exception={ com.mongodb.MongoSecurityException: Exception authenticating MongoCredential {mechanism=null, userName='user123', source='admin', password=<hidden>, mechanismProperties={}}}, caused by {com.mongodb.MongoCommandException: Command failed with error 18 : 'Authentication failed.' on server 192.168.1.10:27010 . The full response is { "ok" : 0.0, "code" : 18, "errmsg" : "Authentication failed." }}}] If you start looking the error content First you encounter with Timeout Exception which may mislead you. It is basically an authentication error. I