Как узнать 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