I mark lockstate as violatile, which ensures it is usable for memory locking in this example.
This is wrong assumption. From many links about, I picked one, http://en.wikipedia.org/wiki/Volatile_variable
Operations on volatile variables are not atomic, nor do they establish a proper happens-before relationship for threading. This is according to the relevant standards (C, C++, POSIX, WIN32), and this is the matter of fact for the vast majority of current implementations. Thus, the usage of volatile keyword as a portable synchronization mechanism is discouraged by many C/C++ groups.