WaitHandle[] handles = new WaitHandle[]{
new AutoResetEvent(false),
new AutoResetEvent(false)
};
int times = (int)N/2;
int i;
for(i = 0; i < times; i++){
ThreadPool.QueueUserWorkItem(new WaitCallback(Tasks[i*2]), handles[0]);
ThreadPool.QueueUserWorkItem(new WaitCallback(Tasks[i*2+1]), handles[1]);
WaitHandle.WaitAll(handles);
}
if(i*2 < N){
ThreadPool.QueueUserWorkItem(new WaitCallback(Tasks[i*2 + 1]), handles[0]);
WaitHandle.WaitAny(handles);
}
class CountDownLatch {
private object lockobj;
private int counts;
public CountDownLatch(int counts){
this.counts = counts;
}
public void Await(){
lock(lockobj){
while(counts > 0){
Monitor.Wait(lockobj);
}
}
}
public void CountDown(){
lock(lockobj){
counts--;
Monitor.PulseAll(lockobj);
}
}
}
CountDownLatch cdl = new CountDownLatch(N);
for(int i = 0; i < N; i++){
ThreadPool.QueueUserWorkItem(new WaitCallback(Tasks[i]), cdl);
}
cdl.Awati();