Can the lock function be used to implement thread-safe enumeration?

Posted by Daniel on Stack Overflow See other posts from Stack Overflow or by Daniel
Published on 2010-05-14T15:49:28Z Indexed on 2010/05/14 15:54 UTC
Read the original article Hit count: 218

Filed under:
|
|
|

I'm working on a thread-safe collection that uses Dictionary as a backing store.

In C# you can do the following:

  private IEnumerable<KeyValuePair<K, V>> Enumerate() {
     if (_synchronize) {
        lock (_locker) {
           foreach (var entry in _dict)
              yield return entry;
        }
     } else {
        foreach (var entry in _dict)
           yield return entry;
     }
  }

The only way I've found to do this in F# is using Monitor, e.g.:

    let enumerate() =
        if synchronize then
            seq {
                System.Threading.Monitor.Enter(locker)
                try for entry in dict -> entry
                finally System.Threading.Monitor.Exit(locker)
            }
        else seq { for entry in dict -> entry }

Can this be done using the lock function? Or, is there a better way to do this in general? I don't think returning a copy of the collection for iteration will work because I need absolute synchronization.

© Stack Overflow or respective owner

Related posts about F#

Related posts about thread-safety