Difference between revisions of "CSharp Locking and Inter Thread Communication"

From PeformIQ Upgrade
Jump to navigation Jump to search
(Created page with "=Links= * http://www.albahari.com/threading/part4.aspx * http://stackoverflow.com/questions/15164408/lock-free-concurrent-queue * http://stackoverflow.com/questions/505515/c...")
 
Line 25: Line 25:
     }
     }
}
}
</pre>
=Another Example=
Found this one here - http://stackoverflow.com/questions/505515/c-sharp-thread-safety-with-get-set
The nitty gritty:
<pre>
public class Status
{
    private int _code;
    private DateTime _lastUpdate;
    private object _sync = new object();
    public int Code
    {
        get { lock (_sync) { return _code; } }
        set
        {
            lock (_sync) {
                _code = value;
            }
            // Notify listeners
            EventHandler handler = Changed;
            if (handler != null) {
                handler(this, null);
            }
        }
    }
    public DateTime LastUpdate
    {
        get { lock (_sync) { return _lastUpdate; } }
        set { lock (_sync) { _lastUpdate = value; } }
    }
    public event EventHandler Changed;
}
</pre>
'Polling' thread could be as follows:
<pre>
Status status = new Status();
ManualResetEvent changedEvent = new ManualResetEvent(false);
Thread thread = new Thread(
    delegate() {
        status.Changed += delegate { changedEvent.Set(); };
        while (true) {
            changedEvent.WaitOne(Timeout.Infinite);
            int code = status.Code;
            DateTime lastUpdate = status.LastUpdate;
            changedEvent.Reset();
        }
    }
);
thread.Start();
</pre>
</pre>




[[Category:CSharp]]
[[Category:CSharp]]

Revision as of 11:33, 16 March 2014

Links

bool lockWasTaken = false;
var temp = obj;
try
{
    Monitor.Enter(temp, ref lockWasTaken);
    // body
}
finally
{
    if (lockWasTaken)
    {
        Monitor.Exit(temp); 
    }
}

Another Example

Found this one here - http://stackoverflow.com/questions/505515/c-sharp-thread-safety-with-get-set

The nitty gritty:

public class Status
{
    private int _code;
    private DateTime _lastUpdate;
    private object _sync = new object();

    public int Code
    {
        get { lock (_sync) { return _code; } }
        set
        {
            lock (_sync) {
                _code = value;
            }

            // Notify listeners
            EventHandler handler = Changed;
            if (handler != null) {
                handler(this, null);
            }
        }
    }

    public DateTime LastUpdate
    {
        get { lock (_sync) { return _lastUpdate; } }
        set { lock (_sync) { _lastUpdate = value; } }
    }

    public event EventHandler Changed;
}

'Polling' thread could be as follows:

Status status = new Status();

ManualResetEvent changedEvent = new ManualResetEvent(false);

Thread thread = new Thread(
    delegate() {
        status.Changed += delegate { changedEvent.Set(); };

        while (true) {
            changedEvent.WaitOne(Timeout.Infinite);
            int code = status.Code;
            DateTime lastUpdate = status.LastUpdate;
            changedEvent.Reset();
        }
    }
);

thread.Start();