deadlock again
Alexander Bubnov
alek at mts-nn.ru
Sat Nov 27 01:07:20 PST 2004
Many thanks!
I see, nevertheless why is my program deadlocked? You wanted to said
this problem from race condition? But why does it work correctly under
some UNIX, UNIX-like OS?
David Xu wrote:
> Your program has obvious race condition:
> main: create thread A:
>
> LOOP:
>
> A: wait on Start
> main: signal Start
> main: wait on Restart
> A: resumed from Start
> A: Signal Restart
> main: resumed from Restart
> main: Create thread B
> goto loop
>
> This demo shows FreeBSD has better throughput then others.
>
> David Xu
>
> Alexander Bubnov wrote:
>
>> /*
>> Hello!
>> Could you tell me why this exemple is deadlocked under FreeBSD, not
>> Linux?
>> (FreeBSD 4.10 and 5.2 , I have not tried under other versions)
>>
>> a string that includes this problem marked, see below the main function
>>
>> */
>> #include<sys/types.h>
>> #include<sys/ipc.h>
>> #include<sys/sem.h>
>> #include<errno.h>
>> #include<pthread.h>
>> #include<stdlib.h>
>> #include<stdio.h>
>>
>> int Exit=0;/* uses in hand(), changes in main() */
>> int ReStart,Start;/* semaphores ID which returns semget() */
>> /*
>> Start semphore controls starting threads,
>> EXETHREADS - how many threads can start in one time
>> ReStart semaphore for wait when the starting threads display a
>> string
>> */
>> struct sembuf dec={0},inc={0},op={0};/* they initilize in the main
>> function*/
>> void*hand(void*p){
>> do{
>> semop(Start,&dec,1);
>> if(Exit)break;
>> puts(p);
>> semop(ReStart,&inc,1);
>> }while(1);
>> fprintf(stderr,"bye, %s!\n",p);
>> return NULL;
>> }
>>
>> #define MAXTHREADS 5
>> #define EXETHREADS 2 /* number of threads which is executed in one
>> time*/
>> #define ITERAT 2 /* number of iterations, see the main function */
>>
>> int main(void){
>> char*s[MAXTHREADS]={"Mike","Leo","Don","Raph","Splinter"};
>> int i;
>> pthread_t thread[MAXTHREADS];
>> /* to initlize semaphores operations */
>> dec.sem_op=-1,inc.sem_op=1,op.sem_op=EXETHREADS;
>> if( -1==(Start=semget('A',1,0666|IPC_CREAT)) ||
>> -1==(ReStart=semget('B',1,0666|IPC_CREAT))
>> ){perror("semget");return EXIT_FAILURE;}
>> /* to initilize semaphores value */
>> semctl(Start,0,SETVAL,0);
>> semctl(ReStart,0,SETVAL,0);
>> #ifndef linux /* may be this string is not needed, I do not know*/
>> if(pthread_setconcurrency(MAXTHREADS+1))perror("concurrency");
>> #endif
>>
>> /* to create the threads */
>> for(i=0;i<MAXTHREADS;++i)
>> pthread_create(thread+i,NULL,hand,s[i]);
>> for(i=0;i<ITERAT;++i){
>> puts("____START____");
>> semop(Start,&op,1);
>> /* to wait EXETHREADS threads */
>> op.sem_op*=-1;
>> /*
>> !!! this problem is here !!!
>> if I insert 'pause()' or 'while(1)' instend of
>> 'semop(ReStart,&op,1)'
>> that only one thread is executed two time, why?
>> this code does not help too (but I can see
>> names that is printed by hand())
>> op.sem_flg=IPC_NOWAIT
>> while(-1==semop(ReStart,&op,1) && EAGAIN);
>> */
>> semop(ReStart,&op,1);
>> op.sem_op*=-1;
>> puts("____FINISH____");
>> }
>> /* to wait the threads to exit*/
>> semctl(Start,0,SETVAL,MAXTHREADS);
>> Exit=1;
>> for(i=0;i<MAXTHREADS;++i)
>> pthread_join(thread[i],NULL);
>> if( -1==semctl(ReStart,0,IPC_RMID) ||
>> -1==semctl(Start,0,IPC_RMID)
>> ) perror("semdel");
>> return EXIT_SUCCESS;
>> }
>>
>> _______________________________________________
>> freebsd-threads at freebsd.org mailing list
>> http://lists.freebsd.org/mailman/listinfo/freebsd-threads
>> To unsubscribe, send any mail to
>> "freebsd-threads-unsubscribe at freebsd.org"
>>
>>
>
> _______________________________________________
> freebsd-threads at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-threads
> To unsubscribe, send any mail to
> "freebsd-threads-unsubscribe at freebsd.org"
>
>
More information about the freebsd-threads
mailing list