Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

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

Aktivity (1)
Avatar
Petr 0máčka:15.5.2016 20:40

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.5.2016 20:40
Avatar
Odpovídá na Petr 0máčka
sadlomaslox25:15.5.2016 21:49

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.5.2016 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.