zu stoppen? Mein Hauptanliegen ist das boolesche Flag ... ist es sicher, es ohne Synchronisation zu benutzen? Ich habe an mehreren Stellen gelesen, dass es atomar ist (einschließlich der Dokumentation).Ist es sicher, ein boolesches Flag zu verwenden, um die Ausführung eines Threads in C#
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();
}
}
Ist dies ein sicherer Weg, um eine Aufgabe auf diese Weise zu entwerfen? Irgendwelche Vorschläge, Verbesserungen, Kommentare?
Hinweis: Ich schrieb meine benutzerdefinierte CountDownLatch
Klasse für den Fall, dass Sie sich fragen, woher ich es bekomme.
Update:
Hier ist meine CountDownLatch auch:
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();
}
}
@Remus Guter Fang in meiner while-Schleife Code-Reihenfolge. In Bezug auf die volatile Flagge: Macht es wirklich einen Unterschied, ob die Flagge in diesem Fall volatil ist? Wenn es das erste Update vermisst, dann wird es noch einen Durchlauf durch die Schleife machen und es beim nächsten Mal fangen ... – Kiril
Wenn Sie es nicht flüchtig markieren, könnte der generierte Code den Wert in eine Registrierung und Ihre optimieren Thread wird * nie * die Änderung sehen. –
@Remus Ich bekomme es jetzt: die Atomizität hat nichts mit der Sichtbarkeit zwischen Threads zu tun ... nur weil eine Operation in einem CPU-Zyklus ausgeführt wird, bedeutet das nicht, dass das Ergebnis für die anderen Threads sichtbar ist, es sei denn der Wert ist volatil markiert. – Kiril