I thought that the following code would let all the 10 threads run, two at a time, and then print "done" after Release()
is called 10 times. But that's not what happened:
int count = 0;
Semaphore s = new Semaphore(2, 2);
for (int x = 0; x < 10; x++)
{
Thread t = new Thread(new ThreadStart(delegate()
{
s.WaitOne();
Thread.Sleep(1000);
Interlocked.Increment(ref count);
s.Release();
}));
t.Start(x);
}
WaitHandle.WaitAll(new WaitHandle[] { s });
Console.WriteLine("done: {0}", count);
output:
done: 6
If the only way to implement the functionality I'm looking for is to pass an EventWaitHandle
to each thread and then do a WaitAll()
on an array of those EventWaitHandles
, then what's the meaning of doing a WaitAll()
on an array of only a semaphore? In other words, when does the waiting thread unblock?
Console.WriteLine
has it's own locks around it and the order in that the content is output is not guaranteed to be the order in which you call it. You might want to write tick values or use a logging framework that handles this case better. The output doesn't show that two threads aren't running at the same time two-at-a-time. – WingardInterlocked.Increment
instead ofvolatile
: #155051 – StanleystanlyThread
objects around and callJoin
on each one in turn. – Akan