C语言多线程编程(Linux)(1)

前言:什么是进程?进程就是运行中的程序,操作系统为了方便管理运行中的程序,分别给每个程序注册一个进程,每个进程都有一个独有的进程id(进程号)

C语言多线程编程(Linux)(1)

(1)一个进程下可以存在多个线程,线程与线程之间是并发执行的,每个线程也都有一个独特的线程ID

线程进程
标识符类型pthread_tpid_t
获取idpthread_self()getpid()
创建pthread_create()fork()

(2)在Linux中线程id(pthread_t)和进程id(pid_t)都是无符号整数,且上述函数需要包含头文件#include

(3)在mian函数被执行即产生一个主线程,其他线程通过pthread_create()产生,若主线程return(相当于进程结束),则其余线程都会跟着结束

(4)线程的四种状态,就绪,运行,阻塞,终止

1.pthread_create()

(1)第一个参数thread用于存储创建出来的线程的id,第二个参数暂时也不知道是什么一般填NULL(空指针),第三个函数填回调函数的函数名(也就是地址),最后一个函数填回调函数的参数,该函数成功时返回0,创建线程失败返回错误码

(2)什么是回调函数?

回调函数就是线程创建出来要执行的函数,如:

这是回调函数的格式,其中的函数名和函数内的内容是可以修改的

void *hanshuming(void *canshu)
{
    ...
    return (void *)0;
}

2.向mian函数传递参数

其实int main()可以写成int main(int argc,char *argv[]),其中的argc为参数的个数,这个会自动统计,后面的指针数组是我们参数的存放地址

上图中我们调用了main函数,且./exit作为第一个参数传递到主函数中,后面的1 2 3 以字符串的形式同样作为主函数的参数

 3.pthread_exit()

上述我们提到若主线程return,代表这进程的结束,其余线程也会结束,但是如果用pthread_exit()代替return则其他子线程还会继续执行但是如果无论我们在任何线程中调用exit()函数进程都会跟着结束

4.线程的分离

(3)分离一个正在运行的线程,仅仅是通知当前操作系统该线程结束时,其所属资源可以被回收,终止被分离的线程时,会释放其所属的系统资源,但你需手动释放该线程的程序资源如:malloc(),mmap()

(3)一个线程终止后其系统资源不被释放则会变成一个僵尸线程线程被创建时默认是不分离的

(3)int pthread_join(pthread_t tid,void **rval)

调用该函数的线程会变成阻塞状态,直到指定的线程id返回或者调用pthread_exit()或被取消,rval是指定线程的返回码的指针的指针

指定的线程必须不是分离的,否则会出错,被指定的线程会被分离,如果成功返回0,失败返回失败码

(4)调用int pthread_detach(pthread_t ptid)同样可以分离一个线程,成功返回0

版权声明:如无特殊标注,文章均来自网络,本站编辑整理,转载时请以链接形式注明文章出处,请自行分辨。

本文链接:https://www.shbk5.com/dnsj/72869.html