From owner-freebsd-threads@FreeBSD.ORG Fri Jun 11 08:27:16 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 3921116A4CE; Fri, 11 Jun 2004 08:27:16 +0000 (GMT) Received: from mail.pcnet.com (mail.pcnet.com [204.213.232.4]) by mx1.FreeBSD.org (Postfix) with ESMTP id EFBFE43D45; Fri, 11 Jun 2004 08:27:15 +0000 (GMT) (envelope-from eischen@vigrid.com) Received: from mail.pcnet.com (mail.pcnet.com [204.213.232.4]) by mail.pcnet.com (8.12.10/8.12.1) with ESMTP id i5B8R16x021762; Fri, 11 Jun 2004 04:27:01 -0400 (EDT) Date: Fri, 11 Jun 2004 04:27:01 -0400 (EDT) From: Daniel Eischen X-Sender: eischen@pcnet5.pcnet.com To: Sean McNeil In-Reply-To: <1086941779.10026.38.camel@server.mcneil.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII cc: David Xu cc: freebsd-threads@freebsd.org Subject: Re: signal handler priority issue 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, 11 Jun 2004 08:27:16 -0000 On Fri, 11 Jun 2004, Sean McNeil wrote: > Now here is something odd.... > > If I change the program a little, it acts completely different. It > actually works faster and looks correct. I don't get it. This is > pretty much exactly what boehm-gc is doing. > > static void > pause_threads(void) > { > int i; > > printf("Master: pausing all threads.\n"); > for (i = 0; i < NUM_THREADS; i++) { > pthread_kill(tids[i], SIGUSR1); > } > for (i = 0; i < NUM_THREADS; i++) { > if (sem_wait(&semaphore) == -1) > errno_abort("Wait on semaphore"); > } > } Yeah, I almost coded it this way. It seems to work faster because the threads are true workers. They're spinning wasting the CPU. The timeslice is 10 or 20 msec, so you have to wait for each thread to get timesliced out in order for it to have the signal delivered. Instead of: thread 1 spin for 10msec master kill thread 1 master wait thread for thread 1 thread 2 spin for 10msec thread 3 spin for 10msec thread 4 spin for 10msec thread 5 spin for 10msec master wakeup from thread 1 master kill thread 2 thread 3 spin for 10msec thread 4 spin for 10msec thread 5 spin for 10msec master wakeup from thread 2 master kill thread 3 ... you have threads running master thread gets his chance master kill thread 1 master kill thread 2 master kill thread 3 master kill thread 4 master kill thread 5 thread 1 swapped back in, gets signal, pauses thread 2 swapped back in, gets signal, pauses thread 3 swapped back in, gets signal, pauses thread 4 swapped back in, gets signal, pauses thread 5 swapped back in, gets signal, pauses -- Dan Eischen