我在Java和C#的多线程编程方面经验丰富,并开始学习如何在Linux上使用C语言。我在Linux上的编程意义上“长大”,所以我理解它的记忆哲学,过程处理等等。
我的问题不是如何进行线程化。我想知道pthread实际上是如何做到的。它是否为您分叉进程并以某种方式处理您的进程间通信?或者它只是管理地址空间?我想要细节......谷歌搜索只产生了“怎么做”的问题,而不是“如何运作”。
答案 0 :(得分:13)
细节可能太复杂而无法真正进入(没有发布glibc源代码的链接),但我可以给你更好的东西来查找:
Pthread使用sys_clone()创建新线程,内核认为这是一个新任务,恰好与其他线程共享许多数据结构。
要进行同步,pthread严重依赖内核中的futexes。
答案 1 :(得分:11)
在Linux上,fork()
和ptrheads都使用相同的系统调用clone()
,这会创建一个新进程。它们之间的区别仅仅是它们发送给clone()
的参数,在创建新线程时,它只是使两个进程使用相同的内存映射。
请记住,在Linux(和其他现代Unix)中,内存映射,堆栈,处理器状态,PID等是进程的正交特征;所以你可以用一个新的堆栈和进程状态创建一个新进程(共享其他所有东西),并将其称为一个线程。
答案 2 :(得分:4)
Here是pthread.c的源代码。这可以帮助您回答您的问题。