programing

스레드에서 스레드 ID 가져오기

yoursource 2023. 5. 7. 18:54
반응형

스레드에서 스레드 ID 가져오기

예를 들어 C#에서 스레드를 디버깅할 때 각 스레드의 ID를 볼 수 있습니다.

프로그래밍 방식으로 동일한 스레드를 얻을 수 있는 방법을 찾을 수 없었습니다.현재 스레드의 ID(속성)를 가져올 수도 없습니다.Thread.currentThread).

얻는지 . 가 Visual Studio인 수 방법이 요? 그리고 ID로 스레드의 핸들을 얻을 수 있는 방법이 있습니까?2345예를 들면요?

GetThreadId 지정된 네이티브 스레드의 ID를 반환합니다.관리되는 스레드와 함께 작동하는 방법이 있습니다. 스레드 핸들만 찾아서 해당 기능에 전달하면 됩니다.

관리되는 스레드의 경우 를 사용합니다.

은 "" " " " SDK"입니다.System.Environment.CurrentManagedThreadId.

  • GetCurrentThreadId 현재 스레드의 ID를 반환합니다. GetCurrentThreadId현재 더 이상 사용되지 않습니다.NET 2.0.
  • Thread.CurrentThread.ManagedThreadId 현재 관리되는 스레드의 고유 식별자를 반환합니다.System.Environment.CurrentManagedThreadId 하만지,,System.Environment.CurrentManagedThreadId선호됨(CA1840).

예를 들어 C#에서 스레드를 디버깅할 때 각 스레드의 ID를 볼 수 있습니다.

관리되는 스레드의 ID가 됩니다. ManagedThreadId 다멤다 ▁is의▁of▁member.Thread모든 스레드 개체에서 ID를 가져올 수 있습니다.현재 관리됨이 표시됩니다.스레드 ID:

Thread.CurrentThread.ManagedThreadId

OS 스레드 ID(Managed가 아님)를 기준으로 OS 스레드를 가져오려면 다음과 같이 하십시오.스레드 ID), 약간의 linq를 시도할 수 있습니다.

int unmanagedId = 2345;
ProcessThread myThread = (from ProcessThread entry in Process.GetCurrentProcess().Threads
   where entry.Id == unmanagedId 
   select entry).First();

관리되는 스레드를 열거할 방법이 없고 프로세스 간의 관계가 없는 것 같습니다.스레드 및 스레드이므로 ID로 관리되는 스레드를 얻는 것은 어렵습니다.

관리되는 스레드와 관리되지 않는 스레드에 대한 자세한 내용은 이 MSDN 문서를 참조하십시오.

사용되지 않는 를 사용하여 현재 실행 중인 스레드의 ID를 가져올 수 있습니다.이 메서드는 Win32 API 메서드에 PINvoke를 사용합니다.GetCurrentThreadIDWindows 스레드 ID를 반환합니다.

이 메서드는 에 의해 더 이상 사용되지 않는 것으로 표시됩니다.NET 스레드 개체가 단일 Windows 스레드에 해당하지 않으므로 지정된 기간 동안 Windows에서 반환할 수 있는 안정된 ID가 없습니다.NET 스레드.

이러한 이유에 대한 자세한 내용은 구성자의 답변을 참조하십시오.

OS ID를 가져오려면 다음을 사용합니다.

AppDomain.GetCurrentThreadId()

MSDN에 따라:

관리되지 않는 호스트가 관리되는 스레드와 관리되지 않는 스레드 간의 관계를 제어할 수 있기 때문에 운영 체제 스레드 ID는 관리되는 스레드와 고정된 관계가 없습니다.특히, 고급 호스트는 CLR Hosting API를 사용하여 동일한 운영 체제 스레드에 대해 많은 관리되는 스레드를 예약하거나 다른 운영 체제 스레드 간에 관리되는 스레드를 이동할 수 있습니다.

래서기본로으적그,로,Thread개체가 OS 스레드와 반드시 일치하는 것은 아니므로 기본 ID가 노출되지 않습니다.

해킹하려는 사용자:

    public static int GetNativeThreadId(Thread thread)
    {
        var f = typeof(Thread).GetField("DONT_USE_InternalThread",
            BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);

        var pInternalThread = (IntPtr)f.GetValue(thread);
        var nativeId = Marshal.ReadInt32(pInternalThread, (IntPtr.Size == 8) ? 548 : 348); // found by analyzing the memory
        return nativeId;
    }

현재 스레드 ID를 찾으려면 - '스레드'를 사용합니다.현재 스레드입니다.ManagedThreadId'입니다.그러나 이 경우 현재 win32 스레드 ID가 필요할 수 있습니다. pInvoke를 사용하여 다음 기능을 사용합니다.

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

먼저 관리 스레드 ID와 win32 스레드 ID 연결을 저장해야 합니다. win32 ID를 관리 스레드에 매핑하는 사전을 사용합니다.

그런 다음 프로세스를 사용하여 프로세스의 스레드 위에 동일한 스레드를 찾습니다.GetCurrentProcess().스레드를 만들고 해당 ID의 스레드를 찾습니다.

foreach (ProcessThread thread in Process.GetCurrentProcess().Threads)
{
     var managedThread = win32ToManagedThread[thread.id];
     if((managedThread.ManagedThreadId == threadId)
     {
         return managedThread;
     }
}

Windows 10의 오프셋은 0x022C(x64비트 애플리케이션) 및 0x0160(x32비트 애플리케이션)입니다.

public static int GetNativeThreadId(Thread thread)
{
    var f = typeof(Thread).GetField("DONT_USE_InternalThread",
        BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);

    var pInternalThread = (IntPtr)f.GetValue(thread);
    var nativeId = Marshal.ReadInt32(pInternalThread, (IntPtr.Size == 8) ? 0x022C : 0x0160); // found by analyzing the memory
    return nativeId;
}

에서 관되는코서의액에세수있의 수 .Thread관리되는 각 스레드에 대한 유형입니다. ThreadOS 스레드의 개념을 캡슐화합니다. 현재 CLR에서는 관리되는 스레드 및 OS 스레드와 일대일로 일치합니다.그러나 이는 구현 세부사항으로, 향후 변경될 수 있습니다.

Visual Studio에서 표시하는 ID는 실제로는 OS 스레드 ID입니다.이 값은 여러 응답에서 제안한 관리 스레드 ID와 다릅니다.

Thread에는 "IntPtr"이라는 됩니다.DONT_USE_InternalThread기본 OS 구조를 가리킵니다.그러나 이것은 실제로 구현 세부사항이기 때문에 이 IMO를 추구하는 것은 권장되지 않습니다. 그리고 이름은 이것에 의존해서는 안 된다는 것을 나타냅니다.

는 2022년 7월 VS2022 IDE를 할 것을 합니다.System.Environment.CurrentManagedThreadIdThread.CurrentThread.ManagedThreadId

https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1840 에서 인용:

시스템.환경.현재 관리됨ThreadId는 스레드를 작고 효율적으로 대체한 것입니다.현재 스레드입니다.ManagedThreadId 패턴입니다.

스레드를 사용할 수 있습니다.관리되는 스레드 ID를 반환하는 GetHashCode.GetHashCode의 목적을 생각해 보면, 이것은 객체(스레드)에 대한 고유 식별자(예: 사전의 키)여야 합니다.

스레드 클래스에 대한 참조 소스는 여기에서 유용합니다. (특정 항목에 대해 부여됨)NET 구현이 이 소스 코드를 기반으로 하지 않을 수도 있지만 디버깅을 위해 모험을 해보겠습니다.)

GetHashCode는 "객체 동일성의 빠른 확인이 필요한 알고리즘에 대해 이 해시 코드를 제공"하므로 스레드 동일성을 확인하는 데 적합합니다. 예를 들어 특정 메서드가 호출할 스레드에서 실행되고 있다고 주장하는 데 적합합니다.

시스템. 스레딩.스레드.현재스레드 이름

System.Threading.Thread.CurrentThread.ManagedThreadId

언급URL : https://stackoverflow.com/questions/1679243/getting-the-thread-id-from-a-thread

반응형