[原]LINUX_C 线程总结(一)

刘嘉辉 17/08/05 10:54:06

LINUX_C 线程总结(一)

首先来说说我所理解的线程:
但是谈线程又不得不得提一下进程,程序,这三者的联系
或许弄清楚这三种的联系之后,我们或许能够更好的来对这些系统级的实体有一个更加深刻的认知。

  1. 程序,进程,线程这三者之间的关系?

简单来说,一程序可以调用多个进程,比如一个视频播放器程序,里面就存在两个进程:一个是播放视频的进程,一个是下载上传视频的进程。
一个进程又同时调用多个线程,
这个线程是隐藏的,用进程管理器看不到,可用其它的进程管理软件来查看。
三者的逻辑关系是程序调用进程,进程调用线程,一般来说程序下面都是多进程,不同的进程分工不同;进程下面也基本上是多线程的。
可以这样下定义:进程是系统进行资源分配和调用的独立单位,每一个进程,都由它自己的内存空间和系统资源
线程是进程的执行单元,执行路径,线程也是程序使用CPU的最基本单位


学习过程中都能踩了那些坑

i.首先, 就是线程创建函数

c

include


这函数比较坑的一点就是实际用到的时候他的第2,4,项参数是null,那么问题来了,我想给新开线程从此函数传参怎么办,答案是第四项是参数,传入他的指针。别在第三项哪里传。传的时候务必注意指针类型问题,先强转再传,就不会产生警告,后转会产生,这是因为指针字节与你所要转的大小不同,地址资源浪不匹配。
就是( 指针函数与函数指针的简单区别):

指针函数:int *f(int a, int b);

函数指针:int (*f)(int a, int b);

>ii线程的属性超级多  他被包含在一个结构体里边, 有时候创建线程的时候也会用到

typedef struct
{
int detachstate; 线程的分离状态
int schedpolicy; 线程调度策略
struct sched_param schedparam; 线程的调度参数
int inheritsched; 线程的继承性
int scope; 线程的作用域
size_t guardsize; 线程栈末尾的警戒缓冲区大小
int stackaddr_set;
void * stackaddr; 线程栈的位置
size_t stacksize; 线程栈的大小
}pthread_attr_t;

>iii.线程终止问题,那种好一些



线程有好几种退出方式,1.return 返回

2. #使用pthread_exit()函数:

有两种特殊情况要注意,
>1 主线程中,如果从main 函数中返回或者调用了exit函数退出主线程, 则整个进程也会终止,进程实则是主线程, 则整个进程就会终止。
>2 是主线程调用pthread_exit  函数 ,则仅仅是主线程消亡,进程不会结束,进程内的其他线程也不会终止,直到所有线程结束,进程才会结束。
》》》主要是退出函数的选择问题 ,具体用到的时候要特别注意。

3. #线程的资源释放问题
> 线程不会主动释放资源,所以系统提供了两个函数 

``````




<div class="se-preview-section-delimiter"></div>

#include <pthread.h>

1.void pthread_cleanup_push(void (*routine)(void *), void *arg);
2.void pthread_cleanup_pop(int execute);

这在系统中是一个以宏的形式给出的所以必须成对出现

下一篇会介绍线程同步问题

作者:Holy_666 发表于 2017/08/05 10:54:06 原文链接 https://blog.csdn.net/Holy_666/article/details/76709532
阅读:165