2011-07-08 9 views
1

ここに永続的にGUIDを生成するコードがいくつかあります。私はスレッディングについて学ぶためにそれを書いた。 ConcurrentQueueがスレッドセーフであっても、GUIDを生成してエンキューする場所がロックされていることに気づくでしょう。私の実際のコードはNHibernateを使う必要があるので、1つのスレッドだけがキューを満たすようにする必要があります。プロセスがスレッドを失うのはなぜですか?

私はこのコードをタスクマネージャーで監視していますが、プロセスはスレッド数を18(私のマシン上)から14に落としていますが、少なくはありません。これは私のコードが良くないためですか?

また、誰かがこれをリファクタリングすることができますか?私は短いコードが大好きです。

class Program 
{ 
    ConcurrentNewsBreaker Breaker; 

    static void Main(string[] args) 
    { 
     new Program().Execute(); 

     Console.Read(); 
    } 

    public void Execute() 
    { 
     Breaker = new ConcurrentNewsBreaker(); 
     QueueSome(); 
    } 

    public void QueueSome() 
    { 
     ThreadPool.QueueUserWorkItem(DoExecute); 
    } 

    public void DoExecute(Object State) 
    { 
     String Id = Breaker.Pop(); 
     Console.WriteLine(String.Format("- {0} {1}", Thread.CurrentThread.ManagedThreadId, Breaker.Pop())); 

     if (Breaker.Any()) 
      QueueSome(); 
     else 
      Console.WriteLine(String.Format("- {0} XXXX ", Thread.CurrentThread.ManagedThreadId));    
    } 
} 


public class ConcurrentNewsBreaker 
{ 
    static readonly Object LockObject = new Object(); 

    ConcurrentQueue<String> Store = new ConcurrentQueue<String>(); 

    public String Pop() 
    { 
     String Result = null; 
     if (Any()) 
      Store.TryDequeue(out Result); 
     return Result; 
    } 

    public Boolean Any() 
    { 
     if (!Store.Any()) 
     { 
      Task FillTask = new Task(FillupTheQueue, Store); 
      FillTask.Start(); 
      FillTask.Wait(); 
     } 

     return Store.Any(); 
    } 

    private void FillupTheQueue(Object StoreObject) 
    { 
     ConcurrentQueue<String> Store = StoreObject as ConcurrentQueue<String>; 
     lock(LockObject) 
     { 
      for(Int32 i = 0; i < 100; i++) 
       Store.Enqueue(Guid.NewGuid().ToString());    
     } 
    } 
} 
+0

私のPCには2つのコアがあります。 ThreadPoolに自分のプロセスに割り当てるスレッドの数を伝える方法はありますか? – Roman

+1

あなたはいくつのコアを持っていますか?より多くのスレッドを使用すると、ここでどのように役立ちますかあなたのロックは、ここで一度に1つのスレッドのみが役に立つことを意味することに注意してください。 –

+0

@Am - スレッドは決して「プロセス専用」ではありません。スレッド*はプロセスごとです。 –

答えて

2

.NETのThreadPoolを使用しているため、.NET/Windowsは処理待ちの作業量に基づいてスレッド数を管理します。私は、タスクマネージャ でこのコードを監視しながら

+0

Int32の代わりにintを使用するなどのマイナーなこと以外にも、私は切り詰めるべき大きな領域を見ませんでした。申し訳ありません –

+0

私はあなたがそう思ってうれしいです。ありがとう:) – Roman

1

、私はプロセスが14しかし劣らずに(私の のマシン上で)18からのスレッドの数を 低下に気づきます。私のコードが良くないのでこれは ですか?

これは問題を示していません。あなたが16コアのCPUを持っていない限り、14はまだ高いです。

スレッドプールは、スレッドをできるだけ少なく調整して処理しようとします。

スレッド数がの場合は、になると心配する必要があります。

+0

あなたは良い点を作った – Roman

関連する問題