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 <[email protected]> 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
> <[email protected]> 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

Reply via email to