Diskuze: Proč v tomto příkladu zámek i na frontě?

C# .NET .NET (C# a Visual Basic) Proč v tomto příkladu zámek i na frontě? American English version English version

Avatar
Petr 0máčka:

Nemohu přijít na to, proč je v příkladu níže zámek i na frontě (nejenom tedy na kódu metod). Prý je to nezbytné, ale není řečeno již proč.

using System;
using System.Threading;
using System.Collections;

public class CrudeThreadPool
{
static readonly int MaxWorkThreads = 4;
static readonly int WaitTimeout = 2000;

public delegate void WorkDelegate();

public CrudeThreadPool() {
stop = false;
workLock = new Object();
workQueue = new Queue();
threads = new Thread[ MaxWorkThreads ];

for( int i = 0; i < MaxWorkThreads; ++i ) {
threads[i] =
new Thread( new ThreadStart(this­.ThreadFunc) );
threads[i].Start();
}
}

private void ThreadFunc() {
lock( workLock ) {
do {
if( !stop ) {
WorkDelegate workItem = null;
if( Monitor.Wait(wor­kLock, WaitTimeout) ) {
// Process the item on the front of the
// queue
lock( workQueue.SyncRoot ) {
workItem =
(WorkDelegate) workQueue.Dequ­eue();
}
workItem();
}
}
} while( !stop );
}
}

public void SubmitWorkItem( WorkDelegate item ) {
lock( workLock ) {
lock( workQueue.SyncRoot ) {
workQueue.Enqueue( item );
}

Monitor.Pulse( workLock );
}
}

public void Shutdown() {
stop = true;
}

private Queue workQueue;
private Object workLock;
private Thread[] threads;
private volatile bool stop;
}

public class EntryPoint
{
static void WorkFunction() {
Console.WriteLine( "WorkFunction() called on Thread {0}",
Thread.Curren­tThread.Managed­ThreadId );
}

static void Main() {
CrudeThreadPool pool = new CrudeThreadPool();
for( int i = 0; i < 10; ++i ) {
pool.SubmitWor­kItem(
new CrudeThreadPo­ol.WorkDelega­te(
EntryPoint.Wor­kFunction) );
}

// Sleep to simulate this thread doing other work.
Thread.Sleep( 1000 );

pool.Shutdown();
}
}

 
Odpovědět 15. května 20:40
Avatar
Odpovídá na Petr 0máčka
sadlomaslox25:

podle me je cely priklad pekna blbost viz ty dva locky, nepouzivani generickych kolekci, vlastni delegati misto Action, pouzivani threadu misto tasku, a vubec pokus o implementaci vlastniho threadpoolu

 
Nahoru Odpovědět 15. května 21:49
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.