如何在不使用POSIX库<pthread.h>的情况下在C中创建线程

use*_*816 10 c unix multithreading systems-programming

我想在不使用任何POSIX库的情况下在C中实现多线程.任何帮助,将不胜感激.

不:不要使用fork()或vfork().

iab*_*der 13

Linux中的线程本质上是一个与其父级共享内存和资源的进程.的Linux内核并没有一个进程和线程区别,换句话说,有一个没有概念,轻量的Linux进程像其他一些操作系统.Linux中的线程是作为标准进程实现的,因此可以使用clone()通常fork()以下列方式调用的线程来创建线程:

clone(SIGCHLD, 0);
Run Code Online (Sandbox Code Playgroud)

这只会克隆信号处理程序,但是,使用适当的标志可以创建一个线程:

clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0);
Run Code Online (Sandbox Code Playgroud)

这与前一个调用相同,只是地址空间,文件系统资源,文件描述符和信号处理程序由两个进程共享.

另一种方法是使用用户级线程(也称为光纤),这些线程是在用户级实现的执行线程,这意味着操作系统不知道这些线程,并且必须在用户处完成调度或上下文切换 -水平.大多数用户级调度程序都实现为协作调度程序,但也可以使用简单的循环调度来实现抢占式调度程序 .

查看clone(2)手册页了解详细信息,如果您想了解更多信息,我推荐Linux内核开发第3版作者:Robert Love,(不以任何方式与作者有关​​)有一个内部链接,你可以阅读其中的一些内容线上.对于用户级线程,有一个由我编写的最小包,称为libutask,它实现了一个协作和一个抢占式调度程序,你可以根据需要检查源代码.

注1:据我所知,我没有提到UNIX,这是特定于Linux的实现.

注意2:使用clone创建自己的线程不是一个真实的解决方案,请阅读您可能需要处理的一些问题的注释,这只是问题的答案是可以在不使用pthread的情况下创建线程,在这种情况下答案是肯定的.

  • 您应该明确指出这是一个Linux解决方案,不一定是所有UNIX中都可用的解决方案.但是+1无论如何,因为它是唯一可靠的方式,因为奇怪的限制:-) (2认同)

did*_*erc 7

看:

对于类 UNIX 系统。

另见:

适用于 BSD 和现代 UNIX。

页面提供了许多使用这些原语和更多内容的准系统实现示例。

您可以使用原子指令来实现锁定原语(互斥锁、信号量)。

我还建议查看用户态线程库的实际实现以获得一些提示。请参阅此页面,其中提供了 Linux 的实现列表。

最后,您可能想获得一些关于协程和可能的蹦床的信息,尽管后者没有那么密切相关。