Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 06 Nov 2005 19:17:52 -0500
From:      Nicolas Blais <nb_root@videotron.ca>
To:        Erich Dollansky <oceanare@pacific.net.sg>
Cc:        freebsd-threads@freebsd.org
Subject:   Re: c++ with pthread?
Message-ID:  <200511061918.00437.nb_root@videotron.ca>
In-Reply-To: <436D8181.9090909@pacific.net.sg>
References:  <200511051927.40752.nb_root@videotron.ca> <436D8181.9090909@pacific.net.sg>

index | next in thread | previous in thread | raw e-mail

[-- Attachment #1 --]
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@clk01a:/usr/obj/usr/src/sys/CLK01A 
PGP? : http://www.clkroot.net/security/nb_root.asc

[-- Attachment #2 --]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (FreeBSD)

iD8DBQBDbp04z38ton5LGeIRAuouAJwPewuWEIpX0QDV/iGjn96t6GEzAACeNKcR
2OK3cAVCryik/bLvv2yuexc=
=I/RQ
-----END PGP SIGNATURE-----
help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200511061918.00437.nb_root>