我的方法中有多少线程
本文关键字:多少 线程 方法 我的 | 更新日期: 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]--;
}
}
如果你不在乎重新进入,但希望有很多同时进入,但又不想每次都检查总数,那么就使用条纹计数器。在低争用的情况下,这将明显较慢,但在核心之间的高争用情况下,速度会快得多,并且可能适用于您的情况。