一、线程的创建
  头文件
  #include <pthread.h>
  函数声明
  int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
  在一个线程中调用pthread_create函数创建新的线程后,当前线程从pthread_create处继续往下执行,start_routine为新创建线程的入口函数,start_routine函数接收一个参数,是通过pthread_create的arg参数传递给它的,该参数的类型为void* ,这个指针按什么类型解释由调用者自己定义,start_routine的返回值类型也是void,这个指针的含义同样由调用者自己定义,start_routine返回时,这个线程退出了,其它线程可以调用pthread_join得到start_routine的返回值。
  参数说明
  第一个参数为指向线程标识符的指针。
  第二个参数用来设置线程属性,用于指定各种不同的线程属性。
  第三个参数是线程运行函数的起始地址,该函数只有一个指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。
  后一个参数是运行函数的参数。
  返回值
  若线程创建成功,则返回0,若线程创建失败,则返回出错编号,并且*thread中的内容是未定义的。
  第一个简单的线程程序

 

#include <stdio.h>
#include <pthread.h>
void printThread(const char *s)
{
pid_t pid;
pthread_t tid;
pid = getpid();
tid = pthread_self();
printf("%s pid %u tid %u (0x%x) ", s, (unsigned int) pid, (unsigned int) tid, (unsigned int) tid);
}
void* run(void* arg)
{
printThread("new thread: ");
return NULL;
}
int main(void)
{
pthread_t pt;
int err = pthread_create(&pt, NULL, run, NULL);
if (err != 0)
printf("can't create thread: %s ", strerror(err));
printThread("main thread:");
pthread_join(pt, NULL);
return 0;
}