Это то, что должно быть встроено в само приложение, чтобы избежать возможного конфликта между потоками.
По моему мнению, поток никогда не должен контролировать выполнение другого (например, приостановить / возобновить), за исключением запуска его. Они должны просто предложить, чтобы другой поток контролировал сам (например, с мьютексами и событиями). Это значительно упрощает управление потоками и уменьшает вероятность состязаний.
Если вы действительно хотите, чтобы поток 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 имеет пролог и эпилог-код для сохранения, установки и восстановления значений, используемых в других потоках.