From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17758 invoked by alias); 15 Jul 2004 11:07:30 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 17733 invoked by uid 48); 15 Jul 2004 11:07:29 -0000 Date: Thu, 15 Jul 2004 11:07:00 -0000 Message-ID: <20040715110729.17732.qmail@sourceware.org> From: "rmerkert at alphatech dot com" To: gcc-bugs@gcc.gnu.org In-Reply-To: <20040114172507.13684.evijaykumar@yahoo.com> References: <20040114172507.13684.evijaykumar@yahoo.com> Reply-To: gcc-bugzilla@gcc.gnu.org Subject: [Bug c++/13684] local static object variable constructed once but ctors and dtors called multiple times on same memory when called in multiple threads X-Bugzilla-Reason: CC X-SW-Source: 2004-07/txt/msg01842.txt.bz2 List-Id: ------- Additional Comments From rmerkert at alphatech dot com 2004-07-15 11:07 ------- The cost of static local variables that are objects is actually quite expensive in general because it requires testing whether or not the object has been constructed. This is has nothing to do with thread safety. Using the double-checked locking as is indicated allows for thread-safe initialization that is no more costly than normal initialization with the exception of having to acquire a mutex. The code as indicated is not quite correct though, because initialization requires a global mutex to avoid a deadlock. So initialization needs to be done like this: static volatile bool guard=true; if (guard) { if (__cxa_guard_acquire (&global_guard)) { if (guard) { // construct variable. guard = false; } __cxa_guard_release (&global_guard) } } Also, the guard boolean needs to be volatile. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13684