Could you try increasing the threads ? Which kernel version are you running? On Thu, May 7, 2009 at 9:30 PM, seshikanth varma <seshikanthvarma@xxxxxxxxx> wrote: > Hi Ramesh, > My program above has uselock=0 for not using pthread_mutex_lock and 1 for > using pthread_mutex_lock. I tried with files too. Theoritically speaking, > this should generate race condition but in practice no :( > One more observation here it is implicitly writing to a file called "stdout" > Thanks > Seshikanth > On Fri, May 8, 2009 at 5:19 AM, Ramesh <rramesh1@xxxxxxxxx> wrote: >> >> Hi Seshi, >> >> This is my suggestion, you can increase the # of threads to may be 100 >> or 200 & run the program without locks & dump the results to a file. >> >> Run the same program with pthread_lock & pthread_unlock enabled, dump >> the results to another file. You could compare the values. >> >> Cheers >> /R >> On Thu, May 7, 2009 at 12:38 PM, seshikanth varma >> <seshikanthvarma@xxxxxxxxx> wrote: >> > Hi, >> > 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 >> > >> > > > > > -- > Regards, > Seshikanth > -- To unsubscribe from this list: send an email with "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx Please read the FAQ at http://kernelnewbies.org/FAQ