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,否则返回出错编号
参数
第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的地址。
最后一个参数是运行函数的参数。
注意
在编译时注意加上-lpthread参数,以调用静态链接库。因为pthread并非Linux系统的默认库。
pthread_join函数
函数简介
函数pthread_join用来等待一个线程的结束。
函数原型为:
extern int pthread_join __P (pthread_t __th, void **__thread_return);
参数:
第一个参数为被等待的线程标识符
第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。
注意
这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。如果执行成功,将返回0,如果失败则返回一个错误号。
例子:
#include<stdio.h> #include<stdlib.h> #include<pthread.h> /* 声明结构体 */ struct member { int num; char *name; }; /* 定义线程pthread */ static void * pthread(void *arg) { struct member *temp; /* 线程pthread开始运行 */ printf("pthread start!\n"); /* 令主线程继续执行 */ sleep(2); /* 打印传入参数 */ temp = (struct member *)arg; printf("member->num:%d\n",temp->num); printf("member->name:%s\n",temp->name); return NULL; } /* main函数 */ int main(int agrc,char* argv[]) { pthread_t tidp; struct member *b; /* 为结构体变量b赋值 */ b = (struct member *)malloc(sizeof(struct member)); b->num=1; b->name="mlq"; /* 创建线程pthread */ if ((pthread_create(&tidp, NULL, pthread, (void*)b)) == -1) { printf("create error!\n"); return 1; } /* 令线程pthread先运行 */ sleep(1); /* 线程pthread睡眠2s,此时main可以先执行 */ printf("mian continue!\n"); /* 等待线程pthread释放 */ if (pthread_join(tidp, NULL)) { printf("thread is not exit...\n"); return -2; } return 0; }
编译与执行结果
编译与执行结果如下图所示,可以看到主线程main和线程pthread交替执行。也就是说是当我们创建了线程pthread之后,两个线程都在执行,证明创建成功。另外,可以看到创建线程pthread时候,传入的参数被正确打印。
到此这篇关于linux创建线程之pthread_create的具体使用的文章就介绍到这了,更多相关linux pthread_create内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
主要内容:一、MySql中的线程创建方式,二、具体源码,三、总结一、MySql中的线程创建方式 为了跨平台主要支持WIN和LINUX,在创建的源码中也可以看这两种创建的方式,在源码中可以清晰的看到区别这两的方式仍然使用的经典的宏判断。其实线程落到这里,基本上就回到了传统的线程处理的整个过程,只是看开发者对其是否进行二次封装和抽象。下面看一下相关的代码分析。 二、具体源码 从上一篇add_connection这个函数开始看: 首先检查一下有没有空闲的线程,如果有
问题内容: 我使用下面的代码来测试pthread_create函数可以创建的最大线程数。 输出为: 那是pthread_create函数可以创建的最大线程数吗? 此外,我使用以下命令查看系统允许的最大线程数: 号码是772432。 为什么我的程序输出不等于值? 我的操作系统是Fodaro 16,具有12核,48G RAM。 问题答案: 每个线程堆栈的默认大小是在测试中人为施加的限制。当分配给进程的
可能重复: pthread\u创建的线程是否与内核线程相同? 我使用下面的代码来测试pthread_create函数可以创建的最大线程数。 输出是: 这是pthread_create函数可以创建的最大线程数吗? 此外,我使用以下命令查看系统允许的最大线程数: 号码是772432。 为什么我的程序的输出不等于的值? 我的操作系统是Fodaro 16,12核,48G RAM。
线程的创建 接下来,我们的第一个目标就是创建一个线程并且让他运行起来。一个线程要开始运行,需要这些准备工作: 建立页表映射,需要包括以下映射空间: 线程所执行的一段指令 线程执行栈 操作系统的部分内存空间 设置起始执行的地址 初始化各种寄存器,比如 sp 可选:设置一些执行参数(例如 argc 和 argv等 ) 思考:为什么线程即便与操作系统无关,也需要在内存中映射操作系统的内存空间呢?Clic
本文向大家介绍Java多线程——之一创建线程的四种方法,包括了Java多线程——之一创建线程的四种方法的使用技巧和注意事项,需要的朋友参考一下 1.实现Runnable接口,重载run(),无返回值 2.继承Thread类,复写run() 使用时通过调用Thread的start()(该方法是native),再调用创建线程的run(),不同线程的run方法里面的代码交替执行。 不足:由于java为单
本文向大家介绍Linux dirname命令的具体使用,包括了Linux dirname命令的具体使用的使用技巧和注意事项,需要的朋友参考一下 01. 命令概述 dirname - 从文件名剥离非目录的后缀 dirname命令去除文件名中的非目录部分,仅显示与目录有关的内容。dirname命令读取指定路径名保留最后一个/及其后面的字符,删除其他部分,并写结果到标准输出。如果最后一个/后无字符,di