Go调度程序是否还管理在运行时创建的非Go Thread?

时间:2017-02-16 04:20:26

标签: winapi go

据我所知,Go运行时调度程序通过将Go例程连续分配给OS线程来管理一些操作系统线程(可能超过GOMAXPROCS?)和Go例程。

所以这基本上意味着Go例程的执行,包括main goroutine,都由go scheduler和OS'线程scheudling管理。

现在这是我的问题..

  1. 如果我在该goroutine的开头调用runtime.LockOSThread(),那么goroutine的执行是否完全由OS的线程调度管理?

  2. 非Go线程的执行是否也完全由OS的线程调度管理?换句话说,如果我通过CreateThread函数(Windows)创建一个非Go Thread,那么管理非Go Thread的执行是否超出了Go的运行时调度程序的范围?

  3. 如果我在非Go线程中使用go func()启动另一个goroutine怎么办?如何管理非Go Thread和goroutine的执行?

  4. 目前,我正在Golang编写一个程序,该程序在go程序的main()函数中运行一个Windows消息循环。 大部分时间它运行良好,但有时消息循环被阻止并在几秒钟后恢复,然后大量旧消息被抽取。 (我的另一个问题:Windows Message Loop is getting blocked and resumed intermittently (golang)

    我不知道为什么会发生这种情况,所以我怀疑是go调度程序的主要goroutine的OS Thread切换。所以我在runtime.LockOSThread()函数的开头添加了main(),以确保Windows消息循环始终在同一个线程中运行。 但问题仍然存在!

    我仍然不知道为什么会这样,但我怀疑这是因为Go调度程序,因为用Python 3.4编写的相同逻辑没有出现这样的问题。

    所以我现在正在尝试通过调用CreateThread(...)函数创建一个新的Windows线程(非Go线程),并在该线程中运行Windows消息循环。

    但是我很好奇这种方法是否与Go运行时调度程序的角度来看在主goroutine运行Windows消息循环中调用runtime.LockOSThread()不同。

    所以我的问题是,'如果我创建一个带有CreateThread(...)函数的新的非Go线程并在该线程中运行Windows消息循环,那么执行该线程是否不受Go的运行时调度程序的影响?'

  5. 任何帮助或想法将不胜感激。 感谢。

1 个答案:

答案 0 :(得分:1)

如果使用git config --global user.email "user@example.com" 例程运行新的OS线程,Go的调度程序将不会触及该线程。但是,您必须为该线程实现与Goroutines通信的方法。例如,您不能直接从CreateThread()创建的线程调用Go方法。相反,您将不得不使用一些基于C的系统来轮询Goroutine中的事件。

顺便说一句,如果你想从主OS线程运行循环,你应该在CreateThread()而不是LockOSThread()中调用init()。见https://github.com/golang/go/wiki/LockOSThread

main()