点击上方蓝字【囧囧妹】一起学习,一起成长!
引言
在Linux下进行多线程编程时,我们通常会使用POSIX线程库(pthread),它提供了一组用于线程管理的API函数,其中最常用的就是pthread_create函数。不过,了解pthread_create的内部工作原理和底层系统调用对于深入理解Linux多线程编程非常重要。
clone与fork
创建级别: fork函数用于创建一个新的进程,新进程是调用进程的副本。 clone函数可以用于创建新的线程或新的进程,取决于传递给它的标志。这使clone比fork更加灵活。 共享资源: fork创建的进程有独立的地址空间,父子进程之间不共享内存。 clone可以选择与父进程共享内存、文件描述符等资源,这可以用于创建线程。 系统开销:
clone函数的核心思想是在新的执行流中执行一个新的函数,这个函数通常是main函数的替代品。这个新函数在创建线程时会被调用,它可以执行不同的任务,使得多线程编程成为可能。
#define _GNU_SOURCE#include <stdio.h>#include <sched.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>#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 finishif (waitpid(pid, NULL, 0) == -1) {perror("waitpid");exit(EXIT_FAILURE);}free(stack);return 0;}
这个示例中,我们使用clone函数创建了一个新线程,新线程将执行child_function函数。父线程和子线程可以共享虚拟内存、文件系统信息等资源,这使得它们可以方便地共享数据。
关注囧囧妹公众号,探索更多有关Linux、技术和编程的精彩内容!
欢迎留言分享你对命令行工具的使用经验和想法。如果你有任何问题,也可以在评论区提问,我会尽力为你解答。
文章转载自囧囧妹,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




