c++ with pthread?

Nicolas Blais nb_root at videotron.ca
Sun Nov 6 16:18:02 PST 2005


On November 5, 2005 11:07 pm, Erich Dollansky wrote:
> Hi,
>
> Nicolas Blais wrote:
> > It compiles and works fine. I'm trying to make the same program in C++. 
> > Is the syntax for pthreading the same as in C? I was wondering if someone
> > can point me in the right direction.
>
> the threading stuff stays the same.
>
> > Also, is there anything I should be worried about when using pthread and
> > C++? (Some years ago, I heard that FreeBSD's pthread didn't like C++...
> > could be a false rumour)
>
> You cannot use classes directly with threading functions. Your classes
> must be aware of threading. You need some mechanism to protect classes
> which are not threadsafe if more than one thread could access an object
> at te same moment of time.
>
> This is a general problem of threading which might causes problems.
>
> Do not forget that C++ uses additional data in objects which the
> programmer does not see.
>
> Erich

//warn long message

Well, at least it's feasible.  

Actually, so far I've converted an single threaded application which was 
helped by pthreading so I'm on the right track. (Instead of performing a 
calculation 5+E07 times, I've split it in 'n' threads that does part of the 
calculation. Threading gives a small performance boost on my 64/3800 but I'm 
sure it would be even more on a dual-core or multiprocessor system).

Now my current problem is that it uses a class and like you mentionned, and 
the threads access the same data within the class. This is the desired 
operation for most of my variables except one which I want to be thread 
independant.

For example: Let's say I have 4 threads performing 1000 calculations. Each 
thread adds +1 to the global counter so that at the end of the program I have 
4000 in that counter. I cannot yet have an individual counter per thread so 
that at the end of the program, each thread's counter = 1000.

I've tried using an array like : array[thread_id] which works fine for small 
numbers, but as soon as I get into large numbers (way into 'double'), I 
occasionnaly get corrupt numbers. The data doesn't get corrupted below a 
counter of around 1+E6. I'm guessing the threads are adding in each other's 
"individual" counters.

From what I found, pthread_key_create() could be what I need, but I haven't 
found one C++ implementation that could get me to understand it. I did find 
many C example, but they either heavily depend on malloc(), casts and such or 
they don't compile at all (some are 5 years old Solaris stuff).

Can anyone show me the correct path?

Any help is truly appreciated.
-- 
FreeBSD 7.0-CURRENT #0: Sat Nov  5 12:12:36 EST 2005     
root at clk01a:/usr/obj/usr/src/sys/CLK01A 
PGP? : http://www.clkroot.net/security/nb_root.asc
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-threads/attachments/20051106/1193dc28/attachment.bin


More information about the freebsd-threads mailing list