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

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

 



On Thu, May 7, 2009 at 10: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");

Are you sure that this variables are shared among threads?
Please keep in mind that every thread has its own copy of registers.

> 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
>
>

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
Please read the FAQ at http://kernelnewbies.org/FAQ



[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