首先需要明确的是这两者根本不是一个维度的东西。
Golang的GMP是Golang从语言层级支持的协程实现模型,而pthread则是遵从POSIX接口规范的线程库。
这里只是由于参加比赛的缘故,所以将这两者联系到了一起。
相同点
1.都需要在切换时保存相应的上下文,都有运行时栈的概念。
不同点
1.Golang在语言层级实现了协程,对用户隐藏的细节会更多一些,对用户来说更加易用一些,直接go一个函数,底层就会帮你实现复杂的调度逻辑,尽可能榨干CPU计算性能,而pthread的话,需要用户的多线程编程经验要多些,也更容易出现一些同步方面的问题。
2.goroutine stack初始大小为2KB,且可以动态调整(在函数调用时可能触发扩容,在GC时可能触发缩容),而thread默认栈大小为8MB,且只支持全局修改缺省大小(ulimit -s)或用系统调用指定(setrlimit)。
3.pthread的操作对象只有内核级线程,针对线程的相关操作(创建/销毁/让出等)都是在内核态发生的,而goroutine的行为都是发生在用户态的(其实这么说也不完全对,因为真正负责工作的底层M还是内核线程)。