From owner-freebsd-threads@FreeBSD.ORG Mon Jan 5 11:20:35 2004 Return-Path: Delivered-To: freebsd-threads@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 0A6D416A4CE for ; Mon, 5 Jan 2004 11:20:35 -0800 (PST) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 195DA43D2D for ; Mon, 5 Jan 2004 11:20:23 -0800 (PST) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) i05JKMFR022598 for ; Mon, 5 Jan 2004 11:20:22 -0800 (PST) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.10/8.12.10/Submit) id i05JKM6A022597; Mon, 5 Jan 2004 11:20:22 -0800 (PST) (envelope-from gnats) Date: Mon, 5 Jan 2004 11:20:22 -0800 (PST) Message-Id: <200401051920.i05JKM6A022597@freefall.freebsd.org> To: freebsd-threads@FreeBSD.org From: Earl Chew Subject: Re: misc/24641: pthread_rwlock_rdlock can deadlock X-BeenThere: freebsd-threads@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: Earl Chew List-Id: Threading on FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Jan 2004 19:20:35 -0000 The following reply was made to PR misc/24641; it has been noted by GNATS. From: Earl Chew To: The Thodes Cc: freebsd-gnats-submit@FreeBSD.org Subject: Re: misc/24641: pthread_rwlock_rdlock can deadlock Date: Mon, 05 Jan 2004 11:11:40 -0800 The Thodes wrote: > First, Earl, GCC objected to your test program. Apologies. I compiled this as a C++ program (g++) hence the missing parameter names. > The patch given is needed to make it compile (in my case, at least). Yes, your patch will fill in the "junk" names, and allow the C compiler to parse the source successfully. > Also, it (your test program) > doesn't even get to trying to acquire the second read lock. It hangs > trying to acquire the write lock. The output is provided in this (long) > follow-up. Oops... there was a cut-and-paste error. Please look at the amended program below. Earl -- #include #include #include #include static pthread_rwlock_t rwlock1 = PTHREAD_RWLOCK_INITIALIZER; static volatile int wrStarted; void * wrfunc(void *unused) { printf("Attempt to acquire write lock\n"); assert(pthread_rwlock_wrlock(&rwlock1) == 0); printf("Acquired write lock\n"); assert(pthread_rwlock_unlock(&rwlock1) == 0); return 0; } static volatile int rdStarted; void * rdfunc(void *unused) { printf("Attempt to acquire read lock first\n"); assert(pthread_rwlock_rdlock(&rwlock1) == 0); printf("Acquired read lock first\n"); rdStarted = 1; while (wrStarted == 0) sleep(1); printf("Attempt to acquire read lock second\n"); assert(pthread_rwlock_rdlock(&rwlock1) == 0); printf("Acquired read lock second\n"); assert(pthread_rwlock_unlock(&rwlock1) == 0); assert(pthread_rwlock_unlock(&rwlock1) == 0); return 0; } int main(int argc, char **argv) { pthread_t wrt; pthread_t rdt; pthread_attr_t a; assert(pthread_rwlock_init(&rwlock1, 0) == 0); assert(pthread_attr_init(&a) == 0); assert(pthread_create(&rdt, &a, rdfunc, NULL) == 0); while (rdStarted == 0) sleep(1); assert(pthread_create(&wrt, &a, wrfunc, NULL) == 0); assert(pthread_join(wrt, 0) == 0); assert(pthread_join(rdt, 0) == 0); assert(pthread_rwlock_destroy(&rwlock1) == 0); assert(pthread_detach(wrt) == 0); assert(pthread_detach(rdt) == 0); return 0; }