关于线程
(一)进程与线程的区别(参考链接:https://blog.csdn.net/weixin_45590051/article/details/116530748)
“进程:资源分配的最小单位;
线程:程序执行的最小单位。”
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。
多进程是指操作系统能同时运行多个任务(程序)
多线程是指在同一个程序中有多个顺序流在执行
(二)线程的原理及优缺点(参考链接:)
一.线程原理
从线程的创建到销毁,总共有6中状态:
* NEW:初始状态,线程被创建,但还没有调用start方法。
* RUNNABLE:可运行状态,java线程把操作系统中的就绪和运行两种状态统称为运行中。
* BLOCKED:阻塞状态,与I/O中的阻塞不同,这里特指被synchronized阻塞,一个正在阻塞等待一个监视器锁的线程处于这一状态。
* WAITING:一个正在无限期等待另一个线程执行一个特别的动作的线程处于这一状态。处于这个状态是由于该线程调用了以下方法:
——不带限时的Object.wait方法;
——不带限时的Thread.join方法;
——LockSupport.park。
——线程执行IO操作,也会被放入等待队列。
然后一直等待其他线程执行一个特别的动作,比如:
——一个调用了某个对象的 Object.wait 方法的线程会等待另一个线程调用此对象的 Object.notify() 或 Object.notifyAll();
——一个调用了 Thread.join 方法的线程会等待指定的线程结束。
* TIMED_WAITING:限时等待状态,超时以后自动恢复。
——如Thread.sleep、带超时的wait和join等。
* TERMINATED:终止状态,表示当前线程执行完毕。
二.线程的优缺点
1.优点
1.线程是一种非常“节俭”的多任务处理方式,不必分配独立的独立的地址空间,切换时间也远远小于进程
2.同一进程下的线程共享同一数据空间,所以一个线程的数据可以直接为其他数据所用,方便又快捷
3.使cpu更有效率,当线程数小于cpu数时,操作系统会保证所有线程运行于不同的cpu上
4.改善程序结构
2.缺点
1.线程没有独立的空间,一个线程死掉整个进程都会挂掉
2.若存在大量线程,程序会降低性能,因为程序得在不同的线程间切换
(三)线程相关操作(包括线程管理函数)
1.pthread_exit
功能:线程终止
原型 void pthread_exit(void *value_ptr);
参数value_ptr:value_ptr不要指向一个局部变量。
返回值:无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身)
void *thread_run(void* arg) { printf("%s,%lu,pid : %d\n",(char*)arg,pthread_self(),getpid()); sleep(10); exit(20); return (void*)10; } int main() { pthread_t tid; pthread_create(&tid,NULL,thread_run,"thread 1"); printf("main : %lu,pid : %d\n",pthread_self(),getpid()); void* ret = NULL; pthread_join(tid,&ret); printf("thread quit code :%d\n",(long long)ret); return 0; }
void *thread_run(void* arg) { printf("%s,%lu,pid : %d\n",(char*)arg,pthread_self(),getpid()); sleep(5); pthread_exit((void*)10); } int main() { pthread_t tid; pthread_create(&tid,NULL,thread_run,"thread 1"); printf("main : %lu,pid : %d\n",pthread_self(),getpid()); void* ret = NULL; pthread_join(tid,&ret); printf("thread quit code :%d\n",(long long)ret); return 0; }
2.pthread_join
功能:等待线程结束
原型 int pthread_join(pthread_t thread, void **value_ptr);
参数thread:线程ID value_ptr:它指向一个指针,后者指向线程的返回值
返回值:成功返回0;失败返回错误码
#include<stdio.h> #include<unistd.h> #include<pthread.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> void *thread_run(void* arg) { printf("%s,%lu,pid : %d\n",(char*)arg,pthread_self(),getpid()); sleep(10); return (void*)10; } int main() { pthread_t tid; pthread_create(&tid,NULL,thread_run,"thread 1"); printf("main : %lu,pid : %d\n",pthread_self(),getpid()); void* ret = NULL; pthread_join(tid,&ret); printf("thread quit code :%d\n",(long long)ret); return 0; }
3.pthread_cancel
功能:取消一个执行中的线程
原型 int pthread_cancel(pthread_t thread);
参数thread:线程ID
返回值:成功返回0;失败返回错误码
#include<stdio.h> #include<unistd.h> #include<pthread.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<stdlib.h> void *thread_run(void* arg) { while(1){ printf("%s,%lu,pid : %d\n",(char*)arg,pthread_self(),getpid()); sleep(1); } } int main() { pthread_t tid; pthread_create(&tid,NULL,thread_run,"thread 1"); printf("main : %lu,pid : %d\n",pthread_self(),getpid()); sleep(10); pthread_cancel(tid); printf("new thread %lu be canceled\n",tid); void* ret = NULL; pthread_join(tid,&ret); printf("thread quit code :%d\n",(long long)ret);//对于云服务器是x64平台,所以需要8位 return 0; }
4.pthread_detach
分离线程
- 默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法释放资源,从而造成系统泄漏。
- 如果不关心线程的返回值,join是一种负担,这个时候,我们可以告诉系统,当线程退出时,自动释放线程资源。
#include<stdio.h> #include<unistd.h> #include<pthread.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<stdlib.h> void *thread_run(void* arg) { //线程自己对自己进行了分离 pthread_detach(pthread_self()); while(1){ printf("%s,%lu,pid : %d\n",(char*)arg,pthread_self(),getpid()); sleep(1); break; } //出现了除0的错误 int a = 10; a /= 0; return (void*)10; } int main() { pthread_t tid; pthread_create(&tid,NULL,thread_run,"thread 1"); printf("main : %lu,pid : %d\n",pthread_self(),getpid()); sleep(3); void* ret = NULL; printf("thread quit code :%d\n",(long long)ret);//对于云服务器是x64平台,所以需要8位 return 0; }
标签:printf,thread,Linux,void,编程,Unix,线程,pthread,include From: https://www.cnblogs.com/yao-yuer/p/16683738.html