From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7926 invoked by alias); 4 Mar 2005 22:27:51 -0000 Mailing-List: contact pthreads-win32-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: pthreads-win32-owner@sources.redhat.com Received: (qmail 7736 invoked from network); 4 Mar 2005 22:27:41 -0000 Received: from unknown (HELO canyonero.dot.net.au) (202.147.68.14) by sourceware.org with SMTP; 4 Mar 2005 22:27:41 -0000 Received: from [202.147.74.107] (helo=ip-74-170.dot.net.au) by canyonero.dot.net.au with esmtp (Exim 3.35 #1 (Debian)) id 1D7LGm-00040w-00 for ; Sat, 05 Mar 2005 09:27:40 +1100 Subject: Re: Handle leak when using pthread mutex with win32 api threads From: Ross Johnson To: Pthreads-Win32 list In-Reply-To: <97ffb310503040903186c281e@mail.gmail.com> References: <97ffb310503040903186c281e@mail.gmail.com> Content-Type: text/plain Date: Fri, 04 Mar 2005 22:27:00 -0000 Message-Id: <1109975258.8332.54.camel@desk.home> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-SW-Source: 2005/txt/msg00021.txt.bz2 On Fri, 2005-03-04 at 12:03 -0500, Gottlob Frege wrote: > On Fri, 4 Mar 2005 17:52:58 +0200, Dmitry Sernii wrote: > > Hello All! > > I have handle leak, when using win32 api threads with pthread mutexes. > > I'm using pthread-win32 2005-01-03 pthread snapshot. > > > > Here is the sample application which reproduce the problem: > > > > #include > > #include > > #include > > > > const int max_threads = 500; > > > > DWORD WINAPI threadProc(void* param) > > { > > static pthread_mutex_t mutex(PTHREAD_RECURSIVE_MUTEX_INITIALIZER); > > that line above is not thread safe. you might initialize the same > mutex multiple times. Not good. > The handle leak comes about because, in pthreads-win32, pthread_mutex_t is only a pointer, and the actual mutex struct is malloced by the library, in this case, the first time you call pthread_mutex_lock(). That is, the library just calls pthread_mutex_init() for you. Also, you must always call pthread_mutex_destroy() to clean up, just the same as if you had called pthread_mutex_init() yourself. So, in your sample code, any destructor that gets called to clean up 'mutex' will only clean up the pointer, leaving the mutex struct and any handles that were created for it behind. POSIX is defined in C terms and you can't use C++ shortcuts like this generally. They may work for some pthreads implementations, but that will be accidental. You need to find a C++ wrapper library or write one if you want to take advantage of C++ magic. Regards. Ross > > pthread_mutex_lock(&mutex); > > pthread_mutex_unlock(&mutex); > > return 0; > > } > > > > void main() > > { > > DWORD id; > > HANDLE th[max_threads]; > > int i; > > for (i=0;i > th[i]=CreateThread(0,0,threadProc,0,0,&id); > > > > for (i=0;i > { > > WaitForSingleObject(th[i],INFINITE); > > CloseHandle(th[i]); > > } > > getch(); > > } > > > > after that if you take a look at Task Manager you can see lots of > > handlers used by the program. If you replace win32 API threads with > > pthreads everything works fine. Also this program works ok if you > > change pthread mutexes with win32 mutexes. > > The same problem happends when using QT threads (version 3.3.4 > > )instead of win32 api threads. > > > > problem reproduces with MSVC 6.0 compiler. > > > > Best Regards, > > Dmitrii Sernii > > >