ThreadQueue problems in "Accelerated C# 2008"

Posted by Singlet on Stack Overflow See other posts from Stack Overflow or by Singlet
Published on 2010-03-23T10:39:43Z Indexed on 2010/03/23 10:43 UTC
Read the original article Hit count: 147

Filed under:
|
|

Example for threading queue book "Accelerated C# 2008" (CrudeThreadPool class) not work correctly. If I insert long job in WorkFunction() on 2-processor machine executing for next task don't run before first is over. How to solve this problem? I want to load the processor to 100 percent

public class CrudeThreadPool
{
static readonly int MAX_WORK_THREADS = 4;
static readonly int WAIT_TIMEOUT = 2000;
public delegate void WorkDelegate();

public CrudeThreadPool() {
stop = 0;
workLock = new Object();
workQueue = new Queue();
threads = new Thread[ MAX_WORK_THREADS ];
for( int i = 0; i < MAX_WORK_THREADS; ++i ) {
   threads[i] = new Thread( new ThreadStart(this.ThreadFunc) );
   threads[i].Start();
}

}
private void ThreadFunc() {
lock( workLock ) {
int shouldStop = 0;
do {
shouldStop = Interlocked.Exchange( ref stop,    stop );
if( shouldStop == 0 ) {
WorkDelegate workItem = null;

if( Monitor.Wait(workLock, WAIT_TIMEOUT) ) {
  // Process the item on the front of the queue
  lock( workQueue ) {
   workItem =(WorkDelegate) workQueue.Dequeue();
  }
workItem();
}
}
} while( shouldStop == 0 );
}
}
public void SubmitWorkItem( WorkDelegate item ) {
lock( workLock ) {

lock( workQueue ) {
workQueue.Enqueue( item );
}
Monitor.Pulse( workLock );
}
}

public void Shutdown() {
Interlocked.Exchange( ref stop, 1 );
}
private Queue workQueue;
private Object workLock;
private Thread[] threads;
private int stop;
}

public class EntryPoint
{
static void WorkFunction() {
Console.WriteLine( "WorkFunction() called on Thread {0}",Thread.CurrentThread.GetHashCode() );
//some long job
double s = 0;
        for (int i = 0; i < 100000000; i++)
            s += Math.Sin(i);
}

static void Main() {
CrudeThreadPool pool = new CrudeThreadPool();
for( int i = 0; i < 10; ++i ) {
pool.SubmitWorkItem(
new CrudeThreadPool.WorkDelegate(
EntryPoint.WorkFunction) );
}
pool.Shutdown();
}
}

© Stack Overflow or respective owner

Related posts about c#

Related posts about multithreading