Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 22 Feb 2005 14:42:44 +0200
From:      Giorgos Keramidas <keramida@ceid.upatras.gr>
To:        Jonathon McKitrick <jcm@FreeBSD-uk.eu.org>
Cc:        freebsd-questions@freebsd.org
Subject:   Re: Best way to share data between threads
Message-ID:  <20050222124244.GA80450@orion.daedalusnetworks.priv>
In-Reply-To: <20050222121911.GA63213@dogma.freebsd-uk.eu.org>
References:  <20050222055000.GA49525@dogma.freebsd-uk.eu.org> <20050222063810.GA1784@gothmog.gr> <20050222121911.GA63213@dogma.freebsd-uk.eu.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 2005-02-22 12:19, Jonathon McKitrick <jcm@FreeBSD-uk.eu.org> wrote:
>On Tue, Feb 22, 2005 at 08:38:11AM +0200, Giorgos Keramidas wrote:
>:On 2005-02-22 05:50, Jonathon McKitrick <jcm@FreeBSD-uk.eu.org> wrote:
>:>
>:> Hi all,
>:> I'm porting some libraries from Win32 to BSD/Linux.  In the
>:> original code, I receive a Windows event with an attached COM
>:> object.
>:>
>:> Under *nix, what is the best way to copy this?  A message,
>:> followed by accessing shared memory between threads?
>:
>: Does the message really have to be shared across many threads?  I'm
>: only asking because thread-specific message queues are not that
>: hard to build with pthreads.  You will only need a per-thread queue
>: to hold messages and a master thread that 'dispatches' messages to
>: the proper thread/queue.
>
> Well, there will be a data acquisition thread, that when finished,
> will need to signal the main processing thread that a new data
> object has arrived.

There are a couple of ways to do the notification:

	1) Explicit notification using a condition variable.

	2) No notification at all, but restructuring of the thread
	   code to use message queues.

The first can be accomplished by associating a pthread_cond_t with the
data storage area and explicit signalling of the processing thread.
Every time the processing thread has nothing to do (i.e. no data being
processed at the time), it blocks on the condition variable and waits
until the data acquisition thread awakes it.

The second way to solve this is to use minimal synchronization (i.e. a
mutex to protect a common message queue) and a queue of currently
pending messages.  The data acquisition thread gets a copy of the data
and pushes it on the queue, leaving all further work to the processing
thread.  The processing threads awakes periodically, "polling" for new
messages in the queue.  When one is found, it is immediately processed.
When no message is found, the processing thread sleeps for a small
amount of time.



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