Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 16 Mar 2005 13:54:47 -0800
From:      "Michael C. Shultz" <ringworm01@gmail.com>
To:        Peter Schuller <peter.schuller@infidyne.com>
Cc:        Zera William Holladay <zholla1@uic.edu>
Subject:   Re: threads question
Message-ID:  <200503161354.48223.ringworm01@gmail.com>
In-Reply-To: <20050316214014.GA88231@scode-whitestar.mine.nu>
References:  <Pine.GSO.4.43.0503151312090.12075-100000@sea.ntplx.net> <200503151228.17719.ringworm01@gmail.com> <20050316214014.GA88231@scode-whitestar.mine.nu>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wednesday 16 March 2005 01:40 pm, you wrote:
> >this works perfectly because I moved MGPMrUpgrade into
> >the same .c file so it would be a static function:
> >
> >structProperty* property;
> >pthread_t               threads[NTHREADS];
> >pthread_create( &threads[0], NULL, zzMGPMrUpgrade, property );
> >When I use MGPMrUpgrade from a shared library the function runs
> >yet property isn't being passed!
>
> What do you mean by it not being passed? Does your function receive a
> NULL value for the parameter instead of the pointer? (Assuming no
> dirty tricks, the function would by definition always be passed
> *some* value, though it may be NULL.)

I finally figured out what I was doing wrong, it was my lack of 
understanding threads. here is what I was doing:

int main()
{
	int(*fpt)(structProperty*);

	fpt= ThreadFunct;
	runFunc( fpt ); 
}

int Funct( int(*fpt)(structProperty*) )
{
	pthread_t		threads[NTHREADS];
	structProperty* property

	pthread_create( 
		&threads[0],
		NULL, 
		int(*fpt)(structProperty*)ThreadFunct,
		(void*)property );
}

Thats just a rough outline, anyways property was going out of scope
while the thread was running, just as Zera and Daniel warned me about.

I just moved the declaration into main and switched tool kits to motif
from GTK and all is well.

Basically I could not pass a function pointer as a call back with 
paramaters from a GTK button through to actually running the function. 

That is why I moved the declaration of property down a level in the 
first place, didn't occur to me how vital scope is when using threads 
though.

Switched to motif and everything passes flawlessly.  I wish GTK had 
either better docs or wasn't broken, not sure what the problem is 
there, probably my lack of understanding again but I don't care, motif 
will work for what I need to do.

If it wasn't for Zera and Daniel's questions I would have never figured 
this out!

>
> > Hmmm, should I'll try making "property" global then passing a copy
> > of it to each thread?  I think that will guarantee it stays valid.
>
> Since you are asking about makint it global - what is it *now*? It
> would have to be either global, dynamically allocated, or on the
> stack. If it's on the stack, things are guaranteed to blow up unless
> the function in question is guaranteed to not terminate untill all
> threads are done with the data. What is the property pointer being
> initialized/set to?
>
> If it's dynamically allocated you should not have a problem.
>
> And I don't see how static vs. dynamic linking of libraries should
> matter, but perhaps I am overlooking something.

I don't get that either, should not have worked either way as far as I 
can tell.

-Mike





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