一、多线程程序设计

1.线程基本概念

线程是进程中的一个实体,是系统进行独立调度的最小单元;
简单理解:线程是进程的组成部分,反之进程是由线程组成的;
特点:
1.线程与同属一个进程中得到其他线程共享进程的资源;
2.线程不占有额外的资源,仅仅只需要一点点栈资源;
3.如果一个进程中只有一个线程,则该线程就代表了进程自身,也称该线程为 主线程,一旦主线程结束,则进程就终止了。
4.进程中的多个线程可以并发执行。
image.png

2.使用多线程的原因:

2.1 资源消耗少;
2.2 效率高
2.3 方便的数据通讯机制(数据共享)

注意:数据的共享势必会造成同步问题的产生;

3.多线程程序设计的注意事项

主线程不能先于子线程结束,否则子线程可能连运行的机会都没有,原因是主线程结束,则进程就终止了,那么进程的地址空间会被系统回收,子线程没有运行空间,所以无法运行

4.线程的基本操作 image.pngimage.png

4.1线程创建

int pthread_create(pthread_t threadid,const pthread_attr_t attr,void(start_routine)(void),void arg);
image.png

4.2线程获取自身id

pthread_t thid = pthread_tpthread_self(void);
image.png

4.3线程退出(提前):

pthread_exit(void* retval)
注意:reval 所代表的地址空间的数据在线程结束后不能被回收;
image.png

4.4线程等待

pthread_join (pthread_t tid,void ** retval);
pthread_join 阻塞调用线程,往往是主线程来等待子线程退出;同时可以通过retval来获取被等待线程退出时候的返回数据。
image.png

4.5线程取消

可以在一个线程内迫使另一个线程结束。
具体实现:pthread_cancel函数;
注意:该函数只是向被取消的线程发起一个取消请求,被取消的线程是否终止,取决于被取消线程内部对pthread_setcancelstate和pthread_setcanceltype两个函数的调用
image.png
image.png

image.png

image.png

4.6线程清理

  1. 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 )之前。
    image.png