1.创建线程的函数使用的是pthread_create()
#include <pthread.h>
int pthread_create(pthread_t *restrict thread,const pthread_attr_t *restrict attr,
void *(start_routine)(void*),void* restrict arg);
参数restrict限制了只能通过该指针更改所指内存,其他指针均不能更改该内存内容。
start_routine是执行新线程的函数,传给它的参数是arg,函数执行完线程就退出了,其他线程可以调用phread_join()得到此函数的返回值。
thread用来存储新创建线程的线程id,线程id是pthread_t类型,调用pthread_self()可以获取当前线程的id;进程id是pid_t类型,可以通过getpid()获取当前进程的id,同一进程下的多个线程具有相同的pid_t,因此getpid()获取的值都是一样的。
如果创建线程成功则返回0,失败则返回一个正整数。
int pthread_join(pthread_t thread,void **status);
其他线程调用这个函数后,会一直等待线程thread结束,把线程返回值保存在status中。
获取成功则返回0,失败则返回-1,并设置errno。
如果任意线程调用exit或者_exit,那么整个进程的所有线程都会终止,main()函数调用return也相当于调用exit(),为了防止子线程还没有执行完,主线程就已经终止,可以在main()函数里调用sleep(1)来暂停一秒。
下面写一个例子,主函数下创建一个线程,该线程调用一个函数打印当前进程id和线程id,主函数也调用