据我所知,Go运行时调度程序通过将Go例程连续分配给OS线程来管理一些操作系统线程(可能超过GOMAXPROCS?)和Go例程。
所以这基本上意味着Go例程的执行,包括main goroutine,都由go scheduler和OS'线程scheudling管理。
现在这是我的问题..
如果我在该goroutine的开头调用runtime.LockOSThread()
,那么goroutine的执行是否完全由OS的线程调度管理?
非Go线程的执行是否也完全由OS的线程调度管理?换句话说,如果我通过CreateThread
函数(Windows)创建一个非Go Thread,那么管理非Go Thread的执行是否超出了Go的运行时调度程序的范围?
如果我在非Go线程中使用go func()
启动另一个goroutine怎么办?如何管理非Go Thread和goroutine的执行?
目前,我正在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的运行时调度程序的影响?'
任何帮助或想法将不胜感激。 感谢。
答案 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()