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