我的方法中有多少线程

本文关键字:多少 线程 方法 我的 | 更新日期: 2023-09-27 18:20:50

我一直在网上搜索这个答案,但从那以后找不到任何真正的答案。

我有一个正在运行的程序,我想计算在给定的时间有多少线程在我的方法中。

我的Main()函数中有代码:

Parallel.Invoke(MyMethod,MyMethod,MyMethod,MyMethod);

private static void MyMethod()
{
    //how many threads are waiting here???  <--- this is what I am after
    lock (myObj)
    {
        //one thread at a time please
    }
}

这里有人能发光吗??

我的方法中有多少线程

没有办法直接查询给定函数中有多少线程。唯一的方法是手动跟踪

private static int s_threadCount;
private static void MyMethod() {
  Interlocked.Increment(ref s_threadCount);
  try {
    ...
  } finally {
    Interlocked.Decrement(ref s_threadCount);
  }
}

注意:如果这个方法可以递归输入,它不会准确地计算线程数,而是会计算线程数+它们递归输入函数的次数。

唯一的方法是添加一个计数器:

static int counter;
... 
static void SomeMethod() {
    int threadsInMethod = Interlocked.Increment(ref counter);
    try {
        code here
    } finally {
        Interlocked.Decrement(ref counter);
    }
}

注意:如果该方法是可重入的,那么它在嵌套时会高估自己。

不期望同时进入/离开,也不关心重新进入:

static int _cThreads;
static void SomeMethod()
{
  Interlocked.Increment(ref _cThreads);
  try
  {
    /* blah */
  }
  finally
  {
    Interlocked.Decrement(ref _cThreads);
  }
}

是否关心重新进入:

static IDictionary<int, int> _cThreads; // ConcurrentDictionary or alternative thread-safe dictionary
static void SomeMethod()
{
  if(_cThreads.ContainsKey(Thread.CurrentThread.ManagedThreadId))//note that only this thread will hit this key
    _cThreads[Thread.CurrentThread.ManagedThreadId]++
  else
    _cThreads[Thread.CurrentThread.ManagedThreadId] = 1;
  try
  {
    /* blah */
   //When I care about the count then it's _cThreads.Values.Where(v => v != 0).Count()
   //which will mutate while we're trying to count it, but then any
   //answer to this is going to have a degree of staleness
   /*blah*/
  }
  finally
  {
    _cThreads[Thread.CurrentThread.ManagedThreadId]--;
  }
}

如果你不在乎重新进入,但希望有很多同时进入,但又不想每次都检查总数,那么就使用条纹计数器。在低争用的情况下,这将明显较慢,但在核心之间的高争用情况下,速度会快得多,并且可能适用于您的情况。