From owner-freebsd-threads@FreeBSD.ORG Fri Nov 26 12:38:24 2004 Return-Path: Delivered-To: freebsd-threads@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 42C3C16A4D6 for ; Fri, 26 Nov 2004 12:38:24 +0000 (GMT) Received: from smtp.rol.ru (smtp.rol.ru [194.67.21.9]) by mx1.FreeBSD.org (Postfix) with ESMTP id BBF9543D46 for ; Fri, 26 Nov 2004 12:38:23 +0000 (GMT) (envelope-from ab_fatal@mail.ru) Received: from ts3-b139.NNovgorod.dial.rol.ru ([212.92.166.139]:53002 "EHLO mail.ru" smtp-auth: TLS-CIPHER: TLS-PEER-CN1: ) by gnome04.net.rol.ru with ESMTP id S17310413AbUKZMiW (ORCPT ); Fri, 26 Nov 2004 15:38:22 +0300 Message-ID: <41A72410.9080500@mail.ru> Date: Fri, 26 Nov 2004 15:39:44 +0300 From: Alexander Bubnov User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.6) Gecko/20040429 X-Accept-Language: en-us, en MIME-Version: 1.0 To: freebsd-threads@freebsd.org Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 7bit Subject: deadlock X-BeenThere: freebsd-threads@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Threading on FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 26 Nov 2004 12:38:24 -0000 /* 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 #include #include #include #include #include #include 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