C语言 pthread_create() 函数讲解

pthread_create()函数详解

pthread_create是类Unix操作系统(Unix、Linux、Mac OS X等)的创建线程的函数。它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。

头文件:

#include<pthread.h>

函数原型:

int pthread_create (pthread_t * tidp,     const pthread_attr_t * attr,    void * (*start_rtn)(void*),      void *arg);

各个参数说明:

第一个参数为指向线程标识符的指针。

第二个参数用来设置线程属性。

第三个参数是线程运行函数的起始地址。

最后一个参数是运行函数的参数。

编译链接参数:

-lpthread

返回值:

    若线程创建成功,则返回0。若线程创建失败,则返回出错编号,并且*thread中的内容是未定义的。

    返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于指定各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。

    linux下用C语言开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。

注意事项:

    因为pthread并非Linux系统的默认库,而是POSIX线程库。在Linux中将其作为一个库来使用,因此加上 -lpthread(或-pthread)以显式链接该库。函数在执行错误时的错误信息将作为返回值返回,并不修改系统全局变量errno,当然也无法使用perror()打印错误信息。

示例代码:

输出线程标识符:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>

void printids(const char *s)
{
pid_t pid;
pthread_t tid;
pid = getpid();
tid = pthread_self();
printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int) pid, (unsigned int) tid, (unsigned int) tid);

}

void * thr_fn(void *arg)
{
printids("new thread: ");
return NULL;
}

int main()
{
int err;
pthread_t ntid;
err = pthread_create(&ntid, NULL, thr_fn, NULL);
if(err != 0)
{
printf("Can't create thread: %s\n", strerror(err));
}

printids("main thread");
pthread_join(ntid, NULL);

return EXIT_SUCCESS;
}

结果展示:

到此这篇关于C语言 pthread_create() 函数讲解的文章就介绍到这了,更多相关C语言 pthread_create()内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于pthread_create,readlink,getpid等函数的学习与总结

    pthread_create是UNIX环境创建线程函数     具体格式:   #include<pthread.h>   int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void*(*start_rtn)(void*),void *restrict arg);   返回值:若成功则返回0,否则返回出错编号   返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID.att

  • undefined reference to 'pthread_create'的解决方法

    照着GUN/Linux编程指南中的一个例子输入编译,结果出现如下错误: undefined reference to 'pthread_create'undefined reference to 'pthread_join' 问题原因:    pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库. 问题解决:    在

  • linux创建线程之pthread_create的具体使用

    pthread_create函数 函数简介 pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg); 返回值 若成功则返回0,否则返回出错编号 参数 第一个参数为指向线程标识符的指针. 第二

  • C语言 pthread_create() 函数讲解

    pthread_create()函数详解 pthread_create是类Unix操作系统(Unix.Linux.Mac OS X等)的创建线程的函数.它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数. 头文件: #include<pthread.h> 函数原型: int pthread_create (pthread_t * tidp, const pthread_attr_t * attr, void * (*start_rtn)(voi

  • R语言boxplot函数深入讲解

    箱线图简介 箱线图又称箱形图或盒须图,该图是由5个特征值绘制而成的图形. 5个特征值是变量的最大值.最小值.中位数.第1四分位数和第3四分位数. 连接两个分位数画出一个箱子,箱子用中位数分割,把两个极值点与箱子用线条连接,即成箱线图. R中绘制箱线图的函数boxplot (1)基本用法 boxplot(x, ...) (2)公式形式的用法 boxplot(formula, data = NULL, ..., subset, na.action = NULL, drop = FALSE, sep

  • C语言超全面讲解函数的使用方法上

    目录 一.函数的分类 1.库函数 2.自定义函数 3.库函数的分类 二.函数调用 1.传值调用 2.传址调用 三.函数的声明 四.函数定义 五.函数的参数 1.形式参数(形参) 2.实际参数(实参) 六.函数的练习 C语言超全面讲解函数的使用方法下 一.函数的分类 1.库函数 库函数是C语言基础库为了方便程序员进行软件开发而提供了一系列的函数,可以支持可移植性和提高程序的效率. ️ 注意:库函数需要引头文件. 例如:strlen函数的头文件是<string.h> 2.自定义函数 自定义函数和库

  • C语言详细i讲解qsort函数的使用

    目录 qsort 1.int型 2.float型 3.struct型 qsort 功能:Performs a quick sort.(快速排序) 参数:void qsort( void *base, size_t num, size_t width, int (*cmp )(const void *e1, const void *e2 ) ); 头文件:#include <stdlib.h> 用法: 第一个参数待排数组的首元素地址 第二个参数待排数据个数 第三个待排数据中每个参数的大小——单位

  • C语言超全面讲解函数的使用方法下

    目录 一.函数的嵌套调用 二.函数的链式访问 三.函数递归 递归的优缺点 必要条件 使用场景 函数递归的细节说明 举例说明 对两个必要条件的理解 四.递归练习 C语言超全面讲解函数的使用方法上 一.函数的嵌套调用 在定义函数时,一个函数内不能再定义另一个函数,即不能嵌套定义,但可以嵌套调用函数,即在调用一个函数的过程中,又调用另一个函数. ️注意: 函数可以嵌套调用但是不可以嵌套定义. 每一个函数都应该在大括号的外面独立存在. 代码示例: 根据这张图可以清楚的看到,three_line() 函数

  • C语言超详细讲解函数栈帧的创建和销毁

    目录 1.本节目标 2.相关寄存器 3.相关汇编指令 4.什么是函数栈帧 5.什么是调用堆栈 6.函数栈帧的创建和销毁 (1).main函数栈帧的创建与初始化 (2).main函数的核心代码 (3).Add函数的调用过程 (4).Add函数栈帧的销毁 (5).调用完成 7.对开篇问题的解答 1.本节目标 C语言绝命七连问,你能回答出几个? 局部变量是如何创建的?为什么局部变量不初始化其内容是随机的?有些时候屏幕上输出的"烫烫烫"是怎么来的?函数调用时参数时如何传递的?传参的顺序是怎样的

  • C语言超详细讲解getchar函数的使用

    目录 一.getchar 函数 二.缓冲区 1.什么是缓冲区 2.为什么要存在缓冲区 3.缓冲区的类型 4.缓冲区的刷新 三.getchar 函数的正确使用 1.getchar 的换行问题 2.getchar 与 scanf 的混合使用 一.getchar 函数 从上面的介绍来看,我们要正确使用getchar函数,首先得了解什么是缓冲区. 二.缓冲区 1.什么是缓冲区 缓冲区又称为缓存,它是内存空间的一部分. 也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部

  • C语言详细分析讲解内存管理malloc realloc free calloc函数的使用

    目录 C语言内存管理 一.动态空间申请 二.动态空间的扩容 三.释放内存 C语言内存管理 malloc && realloc && free && calloc c语言中为了进行动态内存管理,<stdlib.h>中提供了几个函数帮助进行内存管理. 我们知道,C语言中是没有C++中的容器或者说是python中list,set这些高级的数据结构的,我们一旦申请了一段内存空间以后这一段空间就归你了,比如我们举个例子,我们申请一个数组 int nums[

  • C语言超详细讲解字符串函数和内存函数

    目录 字符串函数 长度不受限制的字符串函数 strlen strcpy strcat strcmp 长度受限制的字符串函数介绍 strncpy strncat strncmp 字符串查找以及错误报告 strstr strtok strerror 内存操作函数 memcpy memmove memcmp 字符串函数 长度不受限制的字符串函数 strlen size_t strlen ( const char * str ) 求字符串长度: 字符串以'\0' 作为结束标志,strlen函数返回的是在

  • C语言超详细讲解函数指针的运用

    目录 前言 计算器的例子 回调函数 转移表 前言 前面我们学习了各种各样的指针类型,有些指针可以说是稀奇百怪,特别是函数指针,有些朋友可能觉得,函数指针有些多余,调用函数为什么要用指针调用,直接调用不好吗? 接下来我们从具体的实例来回答同学们的问题,加深对函数指针的理解. 计算器的例子 接下来我们写一个简单的计算器程序,完成不同的计算功能比如加减乘除: #include <stdio.h> //相加函数 int add(int a, int b) { return a + b; } //相减函

随机推荐