From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3722 invoked by alias); 16 May 2006 14:09:12 -0000 Received: (qmail 3558 invoked by uid 22791); 16 May 2006 14:09:06 -0000 X-Spam-Check-By: sourceware.org Received: from py-out-1112.google.com (HELO py-out-1112.google.com) (64.233.166.176) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 16 May 2006 14:09:00 +0000 Received: by py-out-1112.google.com with SMTP id m51so1629849pye for ; Tue, 16 May 2006 07:08:58 -0700 (PDT) Received: by 10.35.9.2 with SMTP id m2mr2893492pyi; Tue, 16 May 2006 07:08:58 -0700 (PDT) Received: by 10.64.213.6 with HTTP; Tue, 16 May 2006 07:08:58 -0700 (PDT) Message-ID: <553911630605160708o3d8a0a19v3a75762655f28d02@mail.gmail.com> Date: Tue, 16 May 2006 14:09:00 -0000 From: "Paolo Brandoli" To: pthreads-win32@sourceware.org Subject: Re: Using pthread_t as a key in a map In-Reply-To: <44692830.3080101@callisto.canberra.edu.au> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: quoted-printable Content-Disposition: inline References: <553911630605091355q64a6eec6i76cadef9b9efa0e@mail.gmail.com> <4467E5FA.3020300@ecosm.com> <44688F28.2020305@callisto.canberra.edu.au> <44692830.3080101@callisto.canberra.edu.au> X-IsSubscribed: yes Mailing-List: contact pthreads-win32-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: pthreads-win32-owner@sourceware.org X-SW-Source: 2006/txt/msg00024.txt.bz2 Thank you very much for your suggestions. I'm going to rewrite the WaitForMultipleObjects-like function. The function should wait until all the mutexes are available, but should NOT keep some of them locked (some cpu cycles are ok) until all of them become available. The code I wrote was based on an example from the IBM website (I think it was for the 360 series? I really don't remember...). I think that I will take this approach to order the mutexes I will include the pthread_t in a structure that contains a scalar unique ID. I will let you know how this task proceeds. Paolo On 5/16/06, Ross Johnson wrote: > Paolo, > > In your original message you said you were trying to create > functionality similar to WaitForMultipleObjects(). In pthreads this is > usually done using condition variables. I.e. similar to the way that > WaitForMultipleObjects() returns the array index of the handle that > caused it to return, or an error. The signaling thread will set the > condition variable directly and the signaled (waiting) thread will check > the condition variable directly. > > Re using pthread_t as a map key, the only compare operation that you can > legally do on pthread_t is test for equality via pthread_equal(). > > Ross > > Ross Johnson wrote: > > > A reasonably portable solution to this came up the other day > > (privately) in relation to using pthreads-win32 pthread_t with > > openssl. It is the following: > > > > #define PT(t) (*((unsigned long *)&(t))) > > pthread_t thrA, thrB; > > ... > > PT(thrA) < PT(thrB) > > > > etc. > > > > Although this still relies on the pointer component being at offset 0 > > inside the pthread_t struct (which was made this way deliberately so > > probably won't change in the future), it does avoid having to > > explicitly use or know about ptw32_handle_t. You still lose the handle > > uniqueness "guarantee" that the pthread_t struct provides though, so > > that you then need to take extra care that the threads that you do > > this with don't detach without you realising it. > > > > By the way, the pthread_t in pthreads-win32 is POSIX compliant. POSIX > > doesn't require pthread_t to be a scalar type, and in fact all but > > requires that POSIX compliant applications not presume the type of > > pthread_t. > > > > Ross > > > > Will Bryant wrote: > > > >> Hi Paolo, > >> > >> Bear in mind that pthreads-win32 is written in C, and operator > >> overloading is a C++ feature, so adding that would prevent > >> pthreads-win32 from compiling with C apps. > >> > >> One alternative is to make a custom comparator type and use that in the > >> map declaration - or you could even simply move those operator overloa= ds > >> to your own units (they don't have to be defined where the type being > >> compared is declared, as long as they've visible at the point where > >> they're used - ie. your map declaration). > >> > >> But bear in mind that in any case, making use of the ptw32_handle_t ty= pe > >> makes your code nonportable, and since portability is generally the > >> reason one is using pthreads-win32 in the first place, this is perhaps > >> not the best design for general use. > >> > >> Will > >> > >> > >> Paolo Brandoli wrote: > >> > >> > >>> I have a source code that uses the pthread_t as a key in a std::map. > >>> Because pthread-win32 defines pthread_t as a structure, the > >>> compilation fails. > >>> > >>> I added the following lines in my pthread.h header in order to allow > >>> the usage of pthread_t in the map: > >>> > >>> bool operator < (const ptw32_handle_t& left, const ptw32_handle_t& > >>> right) > >>> { > >>> return left.p < right.p; > >>> } > >>> > >>> bool operator > (const ptw32_handle_t& left, const ptw32_handle_t& > >>> right) > >>> { > >>> return left.p > right.p; > >>> } > >>> > >>> Bye > >>> Paolo Brandoli > >>> http://www.puntoexe.com > >>> > >>> > >> > >> > >> > >> > >> > > > >