
Hi. There is a test program I would to be explained to me: *** BEGIN OF TEST PROGRAM *** #include <stdio.h> #include <boost/thread.hpp> #define USE_SPINLOCKS //#define USE_MUTEXES boost::thread th1; boost::thread th2; boost::mutex mutex; int global_int = 0; bool IsNotEven(int code) { boost::mutex::scoped_lock locker(mutex); bool ret = (code & 1); return ret; } void thread_func() { for(int i = 0; i < 1000000; ++i) { #ifdef USE_MUTEXES if(IsNotEven(global_int)) // (1) #elif defined USE_SPINLOCKS if(__sync_fetch_and_and(&global_int, 1)) // (2) #else ERROR__WRONG_COMPILED; #endif global_int+=9; else global_int+=1; } } int main() { th1 = boost::thread(&thread_func); th2 = boost::thread(&thread_func); th1.join(); th2.join(); printf("global_int = %d\n", global_int); return 0; } *** END OF TEST PROGRAM *** Results of test program: 1) Test program compiled with USE_SPINLOCKS. Outputs are always: "global_int = 10" "global_int = 10" "global_int = 10" 2) Test program compiled with USE_MUTEXES. Outputs differ from each other: "global_int = 10000008" "global_int = 10000000" "global_int = 9763210" Could you explain me why outputs produced with USE_SPINLOCKS compilation differ from USE_MUTEXES ones? And what is the difference between (1) and (2) lines? Best, Andrew. P.S.: I use guest Ubuntu-8.04 installed on VirtualBox. Host OS = Vista.