服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - 深入探究 Linux 线程创建:glibc 的 pthread_create 与神秘的 clone 函数

深入探究 Linux 线程创建:glibc 的 pthread_create 与神秘的 clone 函数

2023-11-28 17:14囧囧妹 Linux

在Linux下进行多线程编程时,我们通常会使用POSIX线程库(pthread),它提供了一组用于线程管理的API函数,其中最常用的就是pthread_create函数。

在Linux下进行多线程编程时,我们通常会使用POSIX线程库(pthread),它提供了一组用于线程管理的API函数,其中最常用的就是pthread_create函数。不过,了解pthread_create的内部工作原理和底层系统调用对于深入理解Linux多线程编程非常重要。

深入探究 Linux 线程创建:glibc 的 pthread_create 与神秘的 clone 函数

clone与fork

pthread_create函数是glibc中实现的POSIX线程库的一部分,它是基于Linux系统调用clone来创建线程的。clone函数是一个比fork更灵活和底层的系统调用,它允许我们创建一个新的进程或线程,而fork只能创建新进程。

clone函数和fork函数都用于创建新的执行流,但它们有一些重要的区别:

(1) 创建级别:

  • fork函数用于创建一个新的进程,新进程是调用进程的副本。
  • clone函数可以用于创建新的线程或新的进程,取决于传递给它的标志。这使clone比fork更加灵活。

(2) 共享资源:

  • fork创建的进程有独立的地址空间,父子进程之间不共享内存。
  • clone可以选择与父进程共享内存、文件描述符等资源,这可以用于创建线程。

(3) 系统开销:

  • 由于fork会复制整个地址空间,因此开销较大。
  • clone可以选择共享资源,因此通常比fork更高效。   

clone函数的实现原理

clone函数通过传递不同的标志参数来控制其行为。以下是一些常见的标志参数及其作用:

  • CLONE_VM:共享虚拟内存,子进程/线程与父进程共享地址空间。
  • CLONE_FS:共享文件系统信息,子进程/线程与父进程共享文件系统。
  • CLONE_FILES:共享文件描述符表,子进程/线程与父进程共享打开的文件。
  • CLONE_SIGHAND:共享信号处理,子进程/线程与父进程共享信号处理器表。
  • CLONE_PARENT_SETTID:设置父进程的TID(线程ID)。
  • CLONE_CHILD_SETTID:设置子进程/线程的TID。

clone函数的核心思想是在新的执行流中执行一个新的函数,这个函数通常是main函数的替代品。这个新函数在创建线程时会被调用,它可以执行不同的任务,使得多线程编程成为可能。

clone函数创建线程示例

要使用clone函数创建线程,我们需要传递适当的标志参数和一个函数指针,该函数指针指向线程要执行的函数。以下是一个简单的示例:

#define _GNU_SOURCE
#include 
#include 
#include 
#include 
#include 

#define STACK_SIZE (1024 * 1024)

void *child_function(void *arg) {
    printf("Child thread: PID=%d, TID=%ld\n", getpid(), syscall(SYS_gettid));
    return NULL;
}

int main() {
    char *stack;
    char *stack_top;
    pid_t pid;

    stack = (char *)malloc(STACK_SIZE);
    if (stack == NULL) {
        perror("malloc");
        exit(EXIT_FAILURE);
    }

    stack_top = stack + STACK_SIZE;

    pid = clone(child_function, stack_top, CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, NULL);
    if (pid == -1) {
        perror("clone");
        exit(EXIT_FAILURE);
    }

    printf("Parent thread: PID=%d, TID=%ld, Child PID=%d\n", getpid(), syscall(SYS_gettid), pid);

    // Wait for the child to finish
    if (waitpid(pid, NULL, 0) == -1) {
        perror("waitpid");
        exit(EXIT_FAILURE);
    }

    free(stack);
    return 0;
}

这个示例中,我们使用clone函数创建了一个新线程,新线程将执行child_function函数。父线程和子线程可以共享虚拟内存、文件系统信息等资源,这使得它们可以方便地共享数据。

原文地址:https://mp.weixin.qq.com/s?__biz=MzIzNTgzNjA3NA==&mid=2247484843&idx=1&sn=4ef53e570a1a9b652deb32331564797c

延伸 · 阅读

精彩推荐
  • Linux如何在linux网卡上添加多个IP

    如何在linux网卡上添加多个IP

    最简单的方法是使用命令行: ifconfig add eth0 192.168.0.2 netmask 255.255.255.0 ifconfig add eth0:1 192.168.0.2 netmask 255.255.255.0 ifconfig add eth0:2 192.168.0.2 netmask 255.255.255.0 其中...

    Linux教程网8862020-04-14
  • LinuxLinux crontab定时执行任务 命令格式与详细例子

    Linux crontab定时执行任务 命令格式与详细例子

    基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1~59 每分钟用*或者 */1表示 第2列表示小时1~23(0表示0点) 第3列表示日期1~31 第4列表示月份1~...

    未知4172019-05-19
  • Linux超简单的卸载linux的方法

    超简单的卸载linux的方法

    下面介绍一个很简单的方法,小编卸载linux以来都是用这个方法,安全,方便,快捷,需要的朋友可以参考一下...

    服务器之家7492019-07-16
  • LinuxLinux虚拟内存,你理解到位了?

    Linux虚拟内存,你理解到位了?

    前不久组内又有一次我比较期待的分享:”Linux 的虚拟内存”。是某天晚上加班时,我们讨论虚拟内存的概念时,leader 发现几位同事对虚拟内存认识不清后...

    良许Linux11832021-06-03
  • LinuxLinux中显示空闲内存空间的free命令的基本用法

    Linux中显示空闲内存空间的free命令的基本用法

    这篇文章主要介绍了Linux系统中free命令的基本用法,用free命令查看内存空余信息是Linux系统入门学习中的基础知识,需要的朋友可以参考下...

    csdn blog4932019-06-27
  • Linux如何监控 Linux 服务器状态的方法

    如何监控 Linux 服务器状态的方法

    这篇文章主要介绍了如何监控 Linux 服务器状态的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    良许Linux5662020-07-20
  • Linuxlinux桌面环境gnome,kde,xfce,lxde 使用比较

    linux桌面环境gnome,kde,xfce,lxde 使用比较

    Linus Torvalds大神前几日在 Google+上表示,GNOME 3“无可容忍的凌乱”,改投Xfce桌面环境。下面就GNOME, KDE, XFCE和 LXDE略作比较。最终归结起来,没有好坏,适合...

    Linux教程网6652019-12-06
  • LinuxLinux SecureCRT显示乱码解决方案

    Linux SecureCRT显示乱码解决方案

    这篇文章主要介绍了Linux SecureCRT显示乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参...

    陌鉎こ城sHi3352020-09-17