Re: Reading into a buffer and writing from it at the same time
A. Farber wrote:
I'm programming an embedded device which
receives data over USB device and saves it to
a file. Currently it isn't done in an effective way:
....
My problem is that I can't wrap my head around -
where should I insert wait() and notify() calls
and on what objects, so that 2 threads can work
with this buffer simultaneously.
Also I wonder what length should I select for
this cyclic buffer, provided that reading and
writing take approximately same amount of
time (I've measured it in profiler) and that
USB data arrives in _readBufferSize chunks.
....
Given a fixed chunk size, there is no need to share a single circular
buffer. It would be simpler to use several buffers of size
_readBufferSize.
Use two BlockingQueue instances, fullBufferQueue and emptyBufferQueue.
Initially, put all the buffers on emptyBufferQueue. I would initialize
each to reference an instance of ArrayBlockingQueue with capacity equal
to the number of buffers, so an attempt to place a buffer on a queue
will never have to wait for space.
The thread that reads from the USB loops on the following:
emptyBufferQueue.take()
fill the buffer from the USB.
fullBufferQueue.put()
The other thread loops on:
fullBufferQueue.take()
write out the buffer content
emptyBufferQueue.put()
More generally, I think the java.util.concurrent classes should usually
be preferred to direct use of wait and notify.
I would decide the number of buffers by experimentation. Start with one
buffer, benchmark, try two, benchmark again. Go on increasing the number
of buffers until doing so no longer significantly improves performance.
Patricia