在多线程应用中。有没有办法以编程方式让线程B检查thead-A当前的功能是什么?
答案 0 :(得分:5)
通过执行此操作,您可以获得另一个线程的堆栈跟踪:
System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(myThread);
从这里你可以得到调用堆栈,以及它当前正在执行的函数。
答案 1 :(得分:0)
这应该内置到应用程序本身,以避免线程之间可能的争用。
在我看来,除了启动它之外,线程永远不应该控制另一个线程的执行(例如,暂停/恢复)。他们应该只建议另一个线程控制本身(例如,使用互斥和事件)。这极大地简化了线程管理并降低了竞争条件的可能性。
如果你真的希望线程B知道A当前正在做什么线程,那么线程A应该将它传递给线程B(或任何其他线程,例如下面的主线程),例如,使用受互斥锁保护的字符串其中包含函数名称。某些东西(伪代码):
global string threadAFunc = ""
global mutex mutexA
global boolean stopA
function main:
stopA = false
init mutexA
start threadA
do until 20 minutes have passed:
claim mutexA
print "Thread A currently in " + threadAFunc
release mutexA
stopA = true
join threadA
return
function threadA:
string oldThreadAFunc = threadAFunc
claim mutexA
threadAFunc = "threadA"
release mutexA
while not stopA:
threadASub
claim mutexA
threadAFunc = oldThreadAFunc
release mutexA
return
function threadASub:
string oldThreadAFunc = threadAFunc
claim mutexA
threadAFunc = "threadASub"
release mutexA
// Do something here.
claim mutexA
threadAFunc = oldThreadAFunc
release mutexA
return
此方法可用于支持线程的任何语言或环境,而不仅仅是.Net或C#。线程A中的每个函数都有prolog和epilog代码来保存,设置和恢复其他线程中使用的值。