在传统的UNIX进程模型中,一个进程仅有一个控制线程。从概念上讲,这与基于线程的模型中的一个进程只包含一个线程是一样的。
在pthreads下,当一个程序运行时,它也是以一个有一个控制线程的进程形式启动的。一个程序运行的时候,在它创建更多的控制线程前,这个程序与传统的进程是无异的。可以调用 pthread_create函数来新增线程。
如果创建成功,返回0,失败返回错误代码。
如果pthread_create 成功,tidp 指向的内存位置被设置为新建线程的线程ID。
attr 参数用来自定义线程的属性。在第12.3节,我们会详细讲解线程的属性,但是,现在,我们设置attr为NULL,来创建有默认属性的线程。
新线程的起始运行地址是start_rtn函数的入口地址。如果你要给start_rtn传递多个参数,你需要把它们存储在一个结构中,并把这个结构的地址传给arg参数。
example:
thread.c
如果按一般的编译命令,会出现错误 undefined reference to `pthread_create'如下:
sunny@sunny-desktop:~/Desktop$ gcc thread.c -o thread
/tmp/ccK7lPym.o: In function `main':
thread.c:(.text+0x83): undefined reference to `pthread_create'
collect2: ld returned 1 exit status
问题原因:
pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库。
解决方法如下:
sunny@sunny-desktop:~/Desktop$ gcc thread.c -o thread -lpthread
sunny@sunny-desktop:~/Desktop$ ./thread
main thread: pid 3734 tid 3079206592 (0xb788f6c0)
new thread: pid 3734 tid 3079203696 (0xb788eb70)
sunny@sunny-desktop:~/Desktop$