【一 Pthread 并发编程——深入剖析线程基本元素和状态】#include <stdio.h>#include <pthread.h>#include <malloc.h>#include <stdlib.h>#include <string.h>typedef struct info {char s[1024]; // 保存字符信息intsize;// 保存字符串的长度}info_t;staticvoid* func(void* arg) {info_t* in = (info_t*)arg;in->s[in->size] = '\0';printf("string in arg = %s\n", in->s);return NULL;}int main() {info_t* in = malloc(sizeof(info_t)); // 申请内存空间// 保存 HelloWorld 这个字符串 并且设置字符串的长度in->s[0] = 'H';in->s[1] = 'e';in->s[2] = 'l';in->s[3] = 'l';in->s[4] = 'o';in->s[5] = 'W';in->s[6] = 'o';in->s[7] = 'r';in->s[8] = 'l';in->s[9] = 'd';in->size = 10;pthread_t t;// 将 in 作为参数传递给函数 funcpthread_create(&t, NULL, func, (void*)in);pthread_join(t, NULL);free(in); // 释放内存空间return 0;}
上面程序的执行结果如下所示:

文章插图
可以看到函数参数已经做到了正确传递 。
深入理解参数 attr在深入介绍参数 attr 前,我们首先需要了解一下程序的内存布局,在64位操作系统当中程序的虚拟内存布局大致如下所示,从下往上依次为:只读数据/代码区、可读可写数据段、堆区、共享库的映射区、程序栈区以及内核内存区域 。我们程序执行的区域就是在栈区 。

文章插图
根据上面的虚拟内存布局示意图,我们将其简化一下得到单个线程的执行流和大致的内存布局如下所示(程序执行的时候有他的栈帧以及寄存器现场,图中将寄存器也做出了标识):

文章插图
程序执行的时候当我们进行函数调用的时候函数的栈帧就会从上往下生长,我们现在进行一下测试,看看程序的栈帧最大能够达到多少 。
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>int times = 1;void* func(void* arg) {char s[1 << 20]; // 申请 1MB 内存空间(分配在栈空间上)printf("times = %d\n", times);times++;func(NULL);return NULL;}int main() {func(NULL);return 0;}
上述程序的执行结果如下图所示:
文章插图
从上面的程序我们可以看到在第 8 次申请栈内存的时候遇到了段错误,因此可以判断栈空间大小在 8MB 左右,事实上我们可以查看 linux 操作系统上,栈内存的指定大小:

文章插图
事实上在 linux 操作系统当中程序的栈空间的大小默认最大为 8 MB 。
现在我们来测试一下,当我们创建一个线程的时候,线程的栈的大小大概是多少:
#include <stdio.h>#include <pthread.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>int times = 1;void* func(void* arg) {printf("times = %d\n", times);times++;char s[1 << 20]; // 申请 1MB 内存空间(分配在栈空间上)func(NULL);return NULL;}int main() {pthread_t t;pthread_create(&t, NULL, func, NULL);pthread_join(t, NULL);return 0;}
上面的程序执行结果如下图所示,可以看到当我们创建一个线程的时候栈的最大的大小也是 8MB 。
文章插图
设置线程栈空间的大小现在如果我们有一个需求,需要的栈空间大于 8MB,我们应该怎么办呢?这就是我们所需要谈到的 attr,这个变量是一个 pthread_attr_t 对象,这个对象的主要作用就是用于设置线程的各种属性的,其中就包括线程的栈的大小,在下面的程序当中我们将线程的栈空间的大小设置成 24MB,并且使用程序进行测试 。
经验总结扩展阅读
- 2023年1月29日艾灸吉日一览表 2023年1月29日适合艾灸吗
- 2023年9月17日上学吉日一览表 2023年9月17日是上学吉日吗
- 2023年1月29日洗澡好吗 2023年1月29日洗澡吉日一览表
- 2023年1月29日剪头发行吗 2023年1月29日剪头发吉日一览表
- 2023年1月29日分居行吗 2023年1月29日分居好不好
- 2023年9月17日训马吉日一览表 2023年9月17日适合训马吗
- 2023年9月17日搭窝吉日一览表 2023年农历八月初三宜搭窝吗
- 2023年9月17日制作猫窝黄道吉日 2023年9月17日制作猫窝吉日一览表
- 2023年1月29日给佛像开光吉日一览表 2023年1月29日给佛像开光行吗
- 2023年1月29日玉石开光好吗 2023年1月29日玉石开光吉日一览表