2009-06-01 32 views
13

Tôi biết cách sử dụng CPU và sử dụng bộ nhớ cho một quá trình, nhưng tôi đã tự hỏi làm thế nào để có được nó trên một cấp độ cho mỗi thread. Nếu giải pháp tốt nhất là làm một số P-Invoking, thì cũng tốt thôi.Làm cách nào để sử dụng CPU và/hoặc sử dụng RAM của * THREAD * trong C# (mã được quản lý)?

Ví dụ về những gì tôi cần:

Thread myThread = Thread.CurrentThread; 

// some time later in some other function... 

Console.WriteLine(GetThreadSpecificCpuUsage(myThread)); 

Trả lời

7

Bạn không thể có được sử dụng bộ nhớ cho mỗi thread vì bộ nhớ được chia sẻ giữa tất cả các chủ đề trong một quá trình . Làm thế nào hệ điều hành sẽ biết liệu bạn đã cấp phát bộ nhớ trong một luồng và sử dụng nó trong một luồng khác hay không. Và nó có ý nghĩa gì?

+0

Có bộ nhớ cục bộ. – CesarGon

+0

Nhưng thường TLS chỉ được sử dụng để giữ một tham chiếu đến một đối tượng trong bộ nhớ dùng chung. – erikkallen

+0

Nó không phải là hệ điều hành mà phải xác định việc sử dụng của một sợi, là khung chính nó. –

10

Như đã nói, sử dụng bộ nhớ không thể trả lời vì đó là một thuộc tính của quá trình như một toàn thể, nhưng CPU sử dụng:

Process p = Process.GetCurrentProcess(); // getting current running process of the app 
foreach (ProcessThread pt in p.Threads) 
{ 
    // use pt.Id/pt.TotalProcessorTime/pt.UserProcessorTime/pt.PrivilegedProcessorTime 
} 
1

Đây là một chương trình đơn giản mà ra mắt 5 bài có thể tiêu thụ lượng khác nhau của CPU và sau đó so khớp những gì chuỗi quản lý đang tiêu thụ lượng CPU nào.

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Threading; 

class Program 
{ 
[DllImport("Kernel32", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)] 
public static extern Int32 GetCurrentWin32ThreadId(); 

static void Main(string[] args) 
{ 
    Dictionary<int, Thread> threads = new Dictionary<int, Thread>(); 

    // Launch the threads 
    for (int i = 0; i < 5; i++) 
    { 
     Thread cpuThread = new Thread((start) => 
     { 
      lock (threads) 
      { 
       threads.Add(GetCurrentWin32ThreadId(), Thread.CurrentThread); 
      } 

      ConsumeCPU(20 * (int)start); 
     }); 
     cpuThread.Name = "T" + i; 
     cpuThread.Start(i); 
    } 

    // Every second wake up and see how much CPU each thread is using. 
    Thread monitoringThread = new Thread(() => 
     { 
      Stopwatch watch = new Stopwatch(); 
      watch.Start(); 

      while (true) 
      { 
       Thread.Sleep(1000); 
       Console.Write("\r"); 

       double totalTime = ((double)watch.ElapsedMilliseconds); 
       if (totalTime > 0) 
       { 
        Process p = Process.GetCurrentProcess(); 
        foreach (ProcessThread pt in p.Threads) 
        { 
         Thread managedThread; 
         if (threads.TryGetValue(pt.Id, out managedThread)) 
         { 
          double percent = (pt.TotalProcessorTime.TotalMilliseconds/totalTime); 
          Console.Write("{0}-{1:0.00} ", managedThread.Name, percent); 
         } 
        } 
       } 
      } 
     }); 
    monitoringThread.Start(); 
} 


// Helper function that generates a percentage of CPU usage 
public static void ConsumeCPU(int percentage) 
{ 
    Stopwatch watch = new Stopwatch(); 
    watch.Start(); 
    while (true) 
    { 
     if (watch.ElapsedMilliseconds > percentage) 
     { 
      Thread.Sleep(100 - percentage); 
      watch.Reset(); 
      watch.Start(); 
     } 
    } 
} 
} 

Lưu ý rằng có thể CLR sẽ thay đổi chuỗi gốc mà chuỗi được quản lý đang thực hiện theo. Tuy nhiên, trong thực tế, tôi không chắc bao lâu điều này thực sự xảy ra.

Các vấn đề liên quan