一、多线程程序设计
1.线程基本概念
线程是进程中的一个实体,是系统进行独立调度的最小单元;
简单理解:线程是进程的组成部分,反之进程是由线程组成的;
特点:
1.线程与同属一个进程中得到其他线程共享进程的资源;
2.线程不占有额外的资源,仅仅只需要一点点栈资源;
3.如果一个进程中只有一个线程,则该线程就代表了进程自身,也称该线程为 主线程,一旦主线程结束,则进程就终止了。
4.进程中的多个线程可以并发执行。
2.使用多线程的原因:
2.1 资源消耗少;
2.2 效率高
2.3 方便的数据通讯机制(数据共享)
3.多线程程序设计的注意事项
主线程不能先于子线程结束,否则子线程可能连运行的机会都没有,原因是主线程结束,则进程就终止了,那么进程的地址空间会被系统回收,子线程没有运行空间,所以无法运行
4.线程的基本操作 

4.1线程创建
int pthread_create(pthread_t threadid,const pthread_attr_t attr,void(start_routine)(void),void arg);
4.2线程获取自身id
pthread_t thid = pthread_tpthread_self(void);
4.3线程退出(提前):
pthread_exit(void* retval)
注意:reval 所代表的地址空间的数据在线程结束后不能被回收;
4.4线程等待
pthread_join (pthread_t tid,void ** retval);
pthread_join 阻塞调用线程,往往是主线程来等待子线程退出;同时可以通过retval来获取被等待线程退出时候的返回数据。
4.5线程取消
可以在一个线程内迫使另一个线程结束。
具体实现:pthread_cancel函数;
注意:该函数只是向被取消的线程发起一个取消请求,被取消的线程是否终止,取决于被取消线程内部对pthread_setcancelstate和pthread_setcanceltype两个函数的调用



4.6线程清理
- void pthread_cleanup_push(void (rtn)(void ), void *arg);
为线程设置一个线程的清理函数:
2. void pthread_cleanup_pop(int execute);
取消线程的清理函数:
这两个函数是成对使用的;
具体使用过程中:
让 pthread_cleanup_push 与 pthread_cleanup_pop 尽可能多的
包裹线程函数代码;一般情况下 pthread_cleanup_pop往往放置在
线程函数最后,返回语句(return )之前。
