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

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

 



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



[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