Andrew Coppin wrote:

> Felipe Lessa wrote:
>> On Jan 6, 2008 9:30 AM, Andrew Coppin <[EMAIL PROTECTED]>
>> wrote:
>>   
>>> 2. I have a situation where I have a thread generating some data and
>>> putting it into a mutable array, and another thread trying to read that
>>> data. Is there a way I can make the reader thread block if it tries to
>>> read a cell that hasn't been computed yet, but not introduce too much
>>> overhead for cells that have been filled in?

I am fairly sure that this is not possible with an MVar that contains the
whole array.

You could, however, keep the information about which elements have already
been initialized in a separate data structure, for instance a set of
indices (using e.g. Data.IntSet)

>> If your thread fills the array linearly, you could maintain a variable
>> shared by those threads that say the last cell computed, and have the
>> read thread check that before reading. I think this wouldn't create
>> too much overhead, although it seems like there must be something
>> cleverer somewhere.
>>   
> 
> That's just it - it fills the array in a fairly random order. (The
> *scanning* is, however, in linear order.)
> 
> It's not a big problem - I can wait for the entire array to be filled,
> and then scan it. But I'd like to do both in parallel if there's a
> reasonably easy way to do it.
> 
> I suppose an array of MVars would do it, but
> 
> 1. How big is an MVar?
> 
> 2. You have to take the data out of an MVar to read it. In other words,
> only 1 thread can read an MVar at once [by design]. This isn't truly a
> problem in the current case, but it's irritating in principle that I
> can't make it so that once the cell is written, multiple threads can
> read it simultaneously...

I first thought that Control.Concurrent.SampleVar would be your solution but
nope, reading it still makes it empty.

Have you tried STM and TVar? (I mean, an array of TVars).

Cheers
Ben

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to