热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux创建线程周期多少,Linux多线程创造新线程线程的生命周期

创造新线程一、线程的IDpthread_t:结构体(FreeBSD5.2、MacOS10.3)unsignedlongint(linux)usrincludebits

创造新线程

一、线程的ID

1429536597511518.png

pthread_t:结构体(FreeBSD5.2、Mac OS10.3)/unsigned long int(linux)

/usr/include/bits/pthreadtypes.h

获取线程ID:pthread_self()

一个实例:获取主线程ID

#include "apue.h"

int main()

{

pid_t pid;

pthread_t tid;

pid = getpid();

tid = pthread_self();

printf("pid is %u, tid is %x\n", pid, tid);

return 0;

}

思考:线程ID出了进程范围还有效吗?

二、创造新线程

1429536635108401.png

int pthread_create(pthread_t *restrict tidp,

const pthread_attr_t *restrict attr,

void *(*start_routine)(void *),

void *restrict arg)

第一个参数:新线程的id,如果成功则新线程的id回填充到tidp指向的内存

第二个参数:线程属性(调度策略,继承性,分离性...)

第三个参数:回调函数(新线程要执行的函数)

第四个参数:回调函数的参数

返回值:成功返回0,失败则返回错误码

编译时需要连接库libpthread

实例:创建线程,打印ID

程序框图

1429536700274973.png

/*AUTHOR:    WJ

*DATE:        2015-3-18

*

*

*getpid()            获取进程ID

*pthread_self()    获取ID

*

*int pthread_create(pthread_t *thread,

*                     const pthread_attr_t *attr,

*                     void *(*start_routine) (void *),

*                 void *arg);

*第一个参数,新线程id,创建成功系统回填

*第二个参数,新线程到属性,NULL为默认属性

*第三个参数,新线程到启动函数

*第四个参数,传递给新线程

*/

#include "apue.h"

void print_id(char *s)

{

pid_t pid;

pthread_t tid;

pid = getpid();

tid = pthread_self();

printf("%s pid is %u, tid is 0x%x\n", s, pid, tid);

}

void *thread_fun(void *arg)

{

print_id(arg);

return (void *)0;

}

int main()

{

pthread_t ntid;

int err;

err = pthread_create(&ntid, NULL, thread_fun, "new thread");

if(err != 0 )

{

printf("create new thread failed\n");

return 0;

}

print_id("main thread :");

sleep(2);

return 0;

}

线程的生命周期

一、初始线程/主线程

1、当c程序运行时,首先运行main函数。在线程代码中,这个特殊的执行流被称作初始线程或者主线程。你可以在初始线程中做任何普通线程可以做的事情。

2、主线程的特殊性在于,它在main函数返回的时候,会导致进程结束,进程内所有的线程也将会结束。这可不是一个好的现象,你可以在主线程中调用pthread_exit函数,这样进程就会等待所有线程结束时才终止。

3、主线程接受参数的方式是通过argc和argv,而普通的线程只有一个参数void*

4、在绝大多数情况下,主线程在默认堆栈上运行,这个堆栈可以增长到足够的长度。而普通线程的堆栈是受限制的,一旦溢出就会产生错误

二、线程的创建

1、主线程是随着进程的创建而创建

2、其他线程可以通过调用函数来创建,主要调用pthread_create

3、请注意,新线程可能在当前线程从函数pthread_create返回之前就已经运行了,甚至新      线程可能在当前线程从函数pthread_create返回之前就已经运行完毕了。

三、实例:主线程的特殊性

点击(此处)折叠或打开

/*AUTHOR:    WJ

*DATE:        2015-3-18

*

*

*getpid()            获取进程ID

*pthread_self()    获取县城ID

*

*int pthread_create(pthread_t *thread,

*                     const pthread_attr_t *attr,

*                     void *(*start_routine) (void *),

*                 void *arg);

*第一个参数,新线程id,创建成功系统回填

*第二个参数,新线程到属性,NULL为默认属性

*第三个参数,新线程到启动函数

*第四个参数,传递给新线程

*

*主线程的接收的参数都放在argv[], 而参数的个数则由argc统计

*/

#include "apue.h"

struct student {

int age;

char name[20];

char id[4];

};

void *thread_fun(void *stu)

{

sleep(1);

printf("student age is %d, name is %s, id is %s\n",((struct student *)stu)->age, ((struct student *)stu)->name, ((struct student *)stu)->id);

return (void *)0;

}

int main(int argc, char *argv[])

{

pthread_t tid;

int err;

int *rval;

struct student stu;

stu.age = 20;

memcpy(stu.name, "zhangsan", 20);

memcpy(stu.id, "007", 5);

err = pthread_create(&tid, NULL, thread_fun, (void *)(&stu));

if(err != 0)

{

printf(" create new thread failed\n");

return 0;

}

int i;

printf("main thread have %d args\n", argc);

for(i=0; i        {

printf("main thread args is %s\n", argv[i]);

}

pthread_exit(rval);

}

四、线程的四个基本状态

1429536700874577.png

1、就绪:当线程刚被创建时就处于就绪状态,或者当线程被解除阻塞以后也会处于就绪状态。就绪的线程在等待一个可用的处理器,当一个运行的线程被抢占时,它立刻又回到就绪状态

2、运行:当处理器选中一个就绪的线程执行时,它立刻变成运行状态

3、阻塞:线程会在以下情况下发生阻塞:试图加锁一个已经被锁住的互斥量,等待某个条件变量,调用singwait等待尚未发生的信号,执行无法完成的I/O信号,由于内存页错误

4、终止:线程通常启动函数中返回来终止自己,或者调用pthread_exit退出,或者取消线程

1429536715322308.png

五、线程的回收

1、线程的分离属性:

分离一个正在运行的线程并不影响它,仅仅是通知当前系统该线程结束时,其所属的资源可以回收。一个没有被分离的线程在终止时会保留它的虚拟内存,包括他们的堆栈和其他系统资源,有时这种线程被称为“僵尸线程”。创建线程时默认是非分离的

2、如果线程具有分离属性,线程终止时会被立刻回收,回收将释放掉所有在线程终止时未释放的系统资源和进程资源,包括保存线程返回值的内存空间、堆栈、保存寄存器的内存空间等。

3、终止被分离的线程会释放所有的系统资源,但是你必须释放由该线程占有的程序资源。由malloc或者mmap分配的内存可以在任何时候由任何线程释放,条件变量、互斥量、信号灯可以由任何线程销毁,只要他们被解锁了或者没有线程等待。但是只有互斥量的主人才能解锁它,所以在线程终止前,你需要解锁互斥量



推荐阅读
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • Linux 中使用 clone 函数来创建线程
    2019独角兽企业重金招聘Python工程师标准Linux上创建线程一般使用的是pthread库实际上libc也给我们提供了创建线程的函数那就是cloneintclone(i ... [详细]
  • 不知道你是否还记得之前在进程中的信号处理时,提到过阻塞信号集与未决信号集的概念,如果你已经忘记了,请参考《阻塞信号与未决信号》一文回忆一下 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 作者一直强调的一个概念叫做oneloopperthread,撇开多线程不谈,本篇博文将学习,怎么将传统的IO复用pollepoll封装到C++类中。1.IO复用复习使用p ... [详细]
  • pthread_mutex_lockpthread_mutex_lock(pthread_mutex_t*mutex);intpthread_mutex_trylock(pthre ... [详细]
  • C语言编程gcc怎么生成静态库.a和动态库.so
    这篇文章将为大家详细讲解有关C语言编程gcc怎么生成静态库.a和动态库.so,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 实现一个通讯录系统,可添加、删除、修改、查找、显示、清空、排序通讯录信息
    本文介绍了如何实现一个通讯录系统,该系统可以实现添加、删除、修改、查找、显示、清空、排序通讯录信息的功能。通过定义结构体LINK和PEOPLE来存储通讯录信息,使用相关函数来实现各项功能。详细介绍了每个功能的实现方法。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 我首先提高本程序的权限,然后成功得到服务程序(exe)的读写权限,开辟新的远程内存空间,然后拷贝程序执行的代码,但写入我的dll后,服务程序什么反应也没有。 ... [详细]
author-avatar
蒯曼荷学_936
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有