![一本书讲透Java线程:原理与实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/887/51145887/b_51145887.jpg)
1.4.2 线程创建
pthread_create是POSIX提供的线程创建函数,如代码清单1-3所示。它通过调用Linux系统底层的do_fork函数来快速创建一个线程。
代码清单1-3 pthread_create函数
![](https://epubservercos.yuewen.com/DEC20B/30156599704620806/epubprivate/OEBPS/Images/29_01.jpg?sign=1739036979-VJk2uit53JeovJAwOul3XkZFWZuXcXit-0-f0d6f6afd2dc183bee74f8d9c3edcaec)
pthread_create函数有4个参数,详细信息如表1-10所示。
表1-10 pthread_create函数参数
![](https://epubservercos.yuewen.com/DEC20B/30156599704620806/epubprivate/OEBPS/Images/29_02.jpg?sign=1739036979-msgx6LERfFjb393zxWSB9prDt8ikWRgw-0-159f790ce9b27ee70db8e9bb5e1bee87)
如果pthread_create线程创建成功则返回的是0,如果值不为0说明创建失败。
pthread_attr_t是线程的属性定义,主要定义了线程的分离状态、线程栈大小、线程的调度策略等信息。pthread_attr_t的数据结构如代码清单1-4所示。在定义好线程属性对象后,可以调用pthread_attr_init函数来初始化线程属性。在线程创建结束后,可以调用pthread_attr_destroy函数来销毁线程属性对象,以防止内存泄漏。
代码清单1-4 pthread_attr_t数据结构
![](https://epubservercos.yuewen.com/DEC20B/30156599704620806/epubprivate/OEBPS/Images/29_03.jpg?sign=1739036979-Wpm7zYXKf4oyanuiQit08tmRHY3zjjku-0-b2448d2fa1b639a42b8b4704b370c3fe)
在上述代码中,detachstate字段用来表示线程分离状态,线程分离状态决定主线程以什么样的方式来终止自己。在默认情况下,线程是非分离状态的,主线程等待新创建的线程运行结束。而设置成分离线程状态,主线程则不会等待新创建的线程运行,它会运行结束就终止,并立即释放系统资源。可以根据业务的需要选择适当的分离状态,如将JVM的线程设置成线程分离的状态。用户可以通过pthread_attr_setdetachstate函数来动态设置线程的分离状态。
detachstae字段的值:PTHREAD_CREATE_DETACHED表示线程分离;PTHREAD _CREATE_JOINABLE表示非线程分离;stacksize表示线程的栈大小。
当系统中有很多线程时,需要减小每个线程栈的默认大小,以防止进程的地址空间不够用。同样,当线程中调用的函数调用链路很深或分配很多局部变量时,需要增大线程栈的大小,以防止栈内存溢出。在JVM里面专门定义了启动参数-Xss来设定线程栈的大小,也可以通过pthread_attr_setstacksize函数来动态设置线程的栈大小。
代码清单1-5是一个通过pthread_create创建线程的示例。该示例首先定义了task函数来打印3行简单的字符串信息,在main函数内定义了线程的栈大小、线程的分离状态等线程属性信息。然后调用pthread_create来创建一个线程,并把线程绑定上task函数执行。
代码清单1-5 创建线程示例
![](https://epubservercos.yuewen.com/DEC20B/30156599704620806/epubprivate/OEBPS/Images/30_01.jpg?sign=1739036979-lXuvSevypE7gqSnlAXBBmStJdY1zlYEe-0-256ef3f955207fe5a509e8b7b79bc139)
线程的执行结果如下:
![](https://epubservercos.yuewen.com/DEC20B/30156599704620806/epubprivate/OEBPS/Images/31_01.jpg?sign=1739036979-DcO7z3qgAYuQB4oQpZ6hgXIxH4Qxmi2D-0-7caac23a276896049384788de24c2dde)