Re: Not able to generate race condition... please help

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Seshi,

 I  suppose  race is generated with  LOOPCONSTANT = 100000,
 Actually for race  on the variables the threads need to be scheduled in the middle of updating the variables.
 So you should do some minimum  work  in the thread function so other threads get chance to run.

Thanks,
Mukti


On Fri, May 8, 2009 at 10:00 AM, 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


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux