I am learning linux kernel. I have written a simple program to understand the usage of mutex variable.
Ideally the following program should generate race condition and should produce the different values on i,j,k and l rather than i = j = k = l = 100(LOOPCONSTANT * Number of threads) on usage of mutex. Here shared variables between threads are i,j,k and l.
My kernel is not SMP. Can u please tell me where am i going wrong?
======================================================================================================
#include <pthread.h> #include <stdio.h> #define checkResults(string, val) { \ if (val) { \ printf("Failed with %d at %s", val, string); \ exit(1); \ } \ } //#define LOOPCONSTANT 100000 #define LOOPCONSTANT 10 #define THREADS 10 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; volatile int i asm("eax"); /* For using eax ebx ecx & edx for i, j , k and l respectively.
* All the threads shud use eax for i, ebx for j ...
*/ volatile int j asm("ebx"); volatile int k asm("ecx"); volatile int l asm("edx"); int uselock=0; void *threadfunc(void *parm) { int loop = 0; int rc; for (loop=0; loop<LOOPCONSTANT; ++loop) { if (uselock) { rc = pthread_mutex_lock(&mutex); checkResults("pthread_mutex_lock()\n", rc); } ++i; ++j; ++k; ++l; if (uselock) { rc = pthread_mutex_unlock(&mutex); checkResults("pthread_mutex_unlock()\n", rc); } } return NULL; } int main(int argc, char **argv) { pthread_t threadid[THREADS]; int rc=0; int loop=0; pthread_attr_t pta; printf("Entering testcase\n"); printf("Give any number of parameters to show data corruption\n"); if (argc != 1) { printf("A parameter was specified, no serialization is being done!\n"); uselock = 0; } pthread_attr_init(&pta); pthread_attr_setdetachstate(&pta, PTHREAD_CREATE_JOINABLE); printf("Creating %d threads\n", THREADS); for (loop=0; loop<THREADS; ++loop) { rc = pthread_create(&threadid[loop], &pta, threadfunc, NULL); checkResults("pthread_create()\n", rc); } printf("Wait for results\n"); for (loop=0; loop<THREADS; ++loop) { rc = pthread_join(threadid[loop], NULL); checkResults("pthread_join()\n", rc); } printf("Cleanup and show results\n"); pthread_attr_destroy(&pta); pthread_mutex_destroy(&mutex); printf("\nUsing %d threads and LOOPCONSTANT = %d\n", THREADS, LOOPCONSTANT); printf("Values are: (should be %d)\n", THREADS * LOOPCONSTANT); printf(" ==> seshikanth | %d, %d, %d, %d\n", i, j, k, l); printf("Main completed\n"); return 0;
}
======================================================================================================
O/p of the above program:
---------------------------------------
with userlock = 0 (i.e., shud hit race condition)
--------------------------------------------------------------------
gcc check.c -pthread
bash-2.05b$ ./a.out
Creating 10 threads
Wait for results
Cleanup and show results
Using 10 threads and LOOPCONSTANT = 10
Values are: (should be 100)
==> | 100, 100, 100, 100 <<<<<<<<<<<==========*******
Main completed
bash-2.05b$
=====================================
with userlock = 1;
-------------------------
I am getting the same o/p which is correct....
Any help regarding this is greatly appreciated.
Thanks,
Seshikanth