This is the mail archive of the pthreads-win32@sources.redhat.com mailing list for the pthreas-win32 project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Handle leak when using pthread mutex with win32 api threads


On Sat, 2005-03-05 at 15:31 +0200, Dmitrii Sernii wrote:

> I've made small corrections in test sample, so now mutex initialised
> only once, and i've added pthread_mutex_destroy() function call. But
> the problem still remains.
> Here is two test applications - one of them uses API threads, and the
> other pthreads. Program with pthreads don't have any leaks, while
> program with API threads produces lots of them.
> 

Are you dynamic or static linking? If you're using the pthreads dll then
there would seem to be a problem in the library. If you're static
linking then read on ...

The library will be automatically creating POSIX thread handles (with
DETACHED status) because the pthread_mutex_lock() call needs a pthread
ID to track recursive mutex ownership. These pthread IDs are cleaned up
by the pthreads dll.c dllMain() switch. This cleanup doesn't happen
automatically when static linking, in which case it's necessary to
explicitly run the cleanup. There are four routines provided for this
(see README.NONPORTABLE for details):-

BOOL
pthread_win32_process_attach_np (void);

BOOL
pthread_win32_process_detach_np (void);

BOOL
pthread_win32_thread_attach_np (void);

BOOL
pthread_win32_thread_detach_np (void);


Regards.
Ross

> //program with handle leaks
> #include <pthread.h>
> #include <windows.h>
> #include <conio.h>
> 
> pthread_mutex_t mutex(PTHREAD_RECURSIVE_MUTEX_INITIALIZER);
> 
> DWORD WINAPI threadProc(void *param)
> {
> 	pthread_mutex_lock(&mutex);
> 	pthread_mutex_unlock(&mutex);
> 	return 0;
> }
> 
> void main()
> {
> 	const int max_threads = 500;
> 	DWORD id;
> 	HANDLE th[max_threads];
> 	int i;
> 	for (i=0;i<max_threads;i++)
> 	th[i]=CreateThread(0,0,threadProc,0,0,&id);
> 
> 	for (i=0;i<max_threads;i++)
> 	{
> 		WaitForSingleObject(th[i],INFINITE);
> 		CloseHandle(th[i]);
> 	}
> 	pthread_mutex_destroy(&mutex);
> 	getch();
> }
> 
> ==========================
> 
> //program without handle leaks
> #include <pthread.h>
> #include <windows.h>
> #include <conio.h>
> 
> 
> pthread_mutex_t mutex(PTHREAD_RECURSIVE_MUTEX_INITIALIZER);
> 
> void* threadProc(void *param)
> {
> 	pthread_mutex_lock(&mutex);
> 	pthread_mutex_unlock(&mutex);
>     return 0;
> }
> 
> void main()
> {
> 	const int max_threads = 500;
> 	DWORD id;
> 	pthread_t th[max_threads];
> 	int i;
> 
> 	for (i=0;i<max_threads;i++)
> 			pthread_create(&(th[i]),0,threadProc,(void*)i);
> 
> 	for (i=0;i<max_threads;i++)
> 		pthread_join(th[i],(void**)&id);
> 
> 	pthread_mutex_destroy(&mutex);
> 	getch();
> }
> 
> Best regards,
> Dmitrii Sernii
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]