Как узнать id потока на котором в данный момент исполняется горутина?

Как узнать id потока на котором в данный момент исполняется горутина?


Ответы (1 шт):

Автор решения: Pak Uula

Для начала нужно определиться с тем, что вы называете ID потока. Есть идентификатор в pthreads, есть идентификатор потока в ядре Линукса, есть идентификатор потока в ядре Windows.

В любом случае нужно вызывать соответствующую Сишную функцию. Например, в Линуксе для этого есть системный вызов gettid. Для него в Golang предусмотрена обёртка в пакете syscall. Соответственно, вот пример программы, которая печатает линуксовый идентификатор потока для main и для сотни порождённых горутин:

package main

import (
    "fmt"
    "sync"
    "syscall"
)

func print_thread_id(info string, wg *sync.WaitGroup) {
    tid := syscall.Gettid()
    fmt.Printf("%s: Thread ID: %v\n", info, tid)
    if wg != nil {
        wg.Done()
    }
}

func main() {
    print_thread_id("main", nil)
    var wg sync.WaitGroup

    for i := 0; i < 100; i++ {
        wg.Add(1)
        go print_thread_id(fmt.Sprintf("goroutine %d", i+1), &wg)
    }

    wg.Wait()
}

Вывод у неё примерно вот какой:

main: Thread ID: 2804
goroutine 2: Thread ID: 2806
goroutine 5: Thread ID: 2806
goroutine 4: Thread ID: 2806
goroutine 7: Thread ID: 2806
goroutine 1: Thread ID: 2808
goroutine 10: Thread ID: 2808

...

goroutine 83: Thread ID: 2807
goroutine 46: Thread ID: 2807
goroutine 88: Thread ID: 2816
goroutine 93: Thread ID: 2809
goroutine 98: Thread ID: 2804
goroutine 84: Thread ID: 2807
goroutine 99: Thread ID: 2816
goroutine 94: Thread ID: 2806
→ Ссылка