Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it safe to use a boolean flag to stop a thread from running in C#

My main concern is with the boolean flag... is it safe to use it without any synchronization? I've read in several places that it's atomic (including the documentation).

class MyTask {     private ManualResetEvent startSignal;     private CountDownLatch latch;     private bool running;      MyTask(CountDownLatch latch)     {         running = false;         this.latch = latch;         startSignal = new ManualResetEvent(false);     }      // A method which runs in a thread     public void Run()     {         startSignal.WaitOne();         while(running)         {             startSignal.WaitOne();             //... some code         }         latch.Signal();     }      public void Stop()     {         running = false;         startSignal.Set();     }      public void Start()     {         running = true;         startSignal.Set();     }      public void Pause()     {         startSignal.Reset();     }      public void Resume()     {         startSignal.Set();     } } 

Is this a safe way to design a task in this way? Any suggestions, improvements, comments?

Note: I wrote my custom CountDownLatch class in case you're wondering where I'm getting it from.

Update:
Here is my CountDownLatch too:

public class CountDownLatch  {     private volatile int m_remain;     private EventWaitHandle m_event;      public CountDownLatch (int count)     {         if (count < 0)             throw new ArgumentOutOfRangeException();         m_remain = count;         m_event = new ManualResetEvent(false);         if (m_remain == 0)         {             m_event.Set();         }     }      public void Signal()     {         // The last thread to signal also sets the event.         if (Interlocked.Decrement(ref m_remain) == 0)             m_event.Set();     }      public void Wait()     {         m_event.WaitOne();     } } 
like image 432
Kiril Avatar asked Mar 19 '10 04:03

Kiril


People also ask

Is bool thread safe?

The Interlocked class provides a lock-free, non-blocking approach to thread-safety. Not only does it isolate the complexity, but it also provides better performance by eliminating the overhead incurred by locks. The following code shows how to use the Interlocked class to make the bool property thread-safe.

How do you lock a variable in a thread?

Use the lock keyword to guard code that can be executed simultaneously by more than one thread. public class ClassA { private ClassB b = new ClassB(); public void MethodA() { lock (b) { // Do anything you want with b here. } } public void MethodB() { lock (b) { // Do anything you want with b here. } } }


1 Answers

You better mark it volatile though:

The volatile keyword indicates that a field might be modified by multiple concurrently executing threads. Fields that are declared volatile are not subject to compiler optimizations that assume access by a single thread. This ensures that the most up-to-date value is present in the field at all times.

But I would change your loop:

    startSignal.WaitOne();     while(running)     {         //... some code         startSignal.WaitOne();     } 

As it is in your post the 'some code' might execute when the thread is stopped (ie. when Stop is called) which is unexpected and may be even incorrect.

like image 182
Remus Rusanu Avatar answered Sep 23 '22 10:09

Remus Rusanu