1.4.2 线程创建
pthread_create是POSIX提供的线程创建函数,如代码清单1-3所示。它通过调用Linux系统底层的do_fork函数来快速创建一个线程。
代码清单1-3 pthread_create函数
pthread_create函数有4个参数,详细信息如表1-10所示。
表1-10 pthread_create函数参数
如果pthread_create线程创建成功则返回的是0,如果值不为0说明创建失败。
pthread_attr_t是线程的属性定义,主要定义了线程的分离状态、线程栈大小、线程的调度策略等信息。pthread_attr_t的数据结构如代码清单1-4所示。在定义好线程属性对象后,可以调用pthread_attr_init函数来初始化线程属性。在线程创建结束后,可以调用pthread_attr_destroy函数来销毁线程属性对象,以防止内存泄漏。
代码清单1-4 pthread_attr_t数据结构
在上述代码中,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 创建线程示例
线程的执行结果如下: