Difference between revisions of "CSharp Locking and Inter Thread Communication"
Jump to navigation
Jump to search
PeterHarding (talk | contribs) |
PeterHarding (talk | contribs) |
||
Line 68: | Line 68: | ||
</pre> | </pre> | ||
'Polling' thread | A 'Polling' thread would us this as follows: | ||
<pre> | <pre> | ||
Line 75: | Line 75: | ||
ManualResetEvent changedEvent = new ManualResetEvent(false); | ManualResetEvent changedEvent = new ManualResetEvent(false); | ||
Thread | Thread worker = new Thread( | ||
delegate() { | delegate() { | ||
status.Changed += delegate { changedEvent.Set(); }; | status.Changed += delegate { changedEvent.Set(); }; | ||
Line 88: | Line 88: | ||
); | ); | ||
worker.Start(); | |||
</pre> | </pre> | ||
[[Category:CSharp]] | [[Category:CSharp]] |
Latest revision as of 11:34, 16 March 2014
Links
- http://stackoverflow.com/questions/15164408/lock-free-concurrent-queue
- http://stackoverflow.com/questions/505515/c-sharp-thread-safety-with-get-set
- http://stackoverflow.com/questions/251391/why-is-lockthis-bad
- http://www.codeproject.com/Articles/8018/Bounded-Blocking-Queue-One-Lock
- http://stackoverflow.com/questions/6029804/how-does-lock-work-exactly
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; }
A 'Polling' thread would us this as follows:
Status status = new Status(); ManualResetEvent changedEvent = new ManualResetEvent(false); Thread worker = new Thread( delegate() { status.Changed += delegate { changedEvent.Set(); }; while (true) { changedEvent.WaitOne(Timeout.Infinite); int code = status.Code; DateTime lastUpdate = status.LastUpdate; changedEvent.Reset(); } } ); worker.Start();