Linux C多线程编程

创建一个线程

  关于线程的头文件

 #include <pthread.h>

 

  pthread_t用来声明线程ID

typedef unsigned long int pthread_t;

  所有包含这个头文件里边的函数,在编译和链接的时候都要加上一个参数

-pthread  
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

  这个函数会在调用进程中起一个新的线程,新的线程通过调用start_routine这个函数开始执行,arg为start_routine函数的参数(如果没有,则默认为NULL),新启动的线程会以以下几种方式结束

  • 它调用了pthread_exit(3), 对于同一个进程中的另外一个线程调用了pthread_join(3)指定了一个结束状态值.
  • start_routine执行完毕
  • 这个线程被取消执行(pthread_cancel(3))
  • main函数执行完毕

  attr指向一个pthread_attr_t结构体, 这个结构体包含了需要创建线程的各种属性, 如果attr是NULL的话,新的进程就会以默认属性创建.在这个函数返回之前,一个成功调用pthread_create()的线程ID会存储在thread中,这个ID标识了所创建的线程

 

 

 pthread_t pthread_self(void);

  这个函数返回调用线程的ID.这个值与pthread_create()中创建的线程的ID相同(thread), 这个函数总会执行成功的.

 

 

int pthread_join(pthread_t thread, void **retval);

  pthread_join这个函数会等待直到thread所指定的线程执行完毕. 如果thread已经执行完毕,这个函数会立即返回.但是,thread所指定的线程必须是joinable,什么是joinable呢?

一个线程是可连接的,当且仅当它描述了一个可执行的线程

一个线程是不可连接的,当他符合以下任意一种情况

  • if it was default-constructed.
  • if it has been moved from (either constructing another thread object, or assigning to it).
  • if either of its members join or detach has been called.

   代码中如果没有pthread_join, 主线程会很快结束从而使整个进程结束,创建的线程就没有机会开始执行就结束了. 加入pthread_join后,主线程会一直等待直到等待的线程结束自己才结束, 使创建的线程有机会执行.

posted @ 2016-04-30 10:39  spxcds  阅读(1971)  评论(0编辑  收藏  举报