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