线程
进程的特点:
进程有独立地地址空间。
LINUX为每个进程创建task_struct
每个进程都参与内核调度,互不影响
线程的特点:
进程在切换时,系统开销大,引入轻量级进程LWP
同一进程中的线程共享相同的地址空间
Linux不区分进程,线程,统一由task_struct来管理所有进程和线程。
通常线程指共享地址空间的多个任务
线程提高任务切换效率,避免额外TLB&cache的刷新
线程的创建
1 #include <pthread.h> 2 3 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*routine)(void *), void *arg); 4 5 //成功返回0,失败返回错误码
//错误码不可由perror打印,可由strerror打印 6 //参数: 7 // thread 线程对象 8 // attr 线程属性,NULL代表默认属性 9 // routine 函数指针--线程执行的函数 10 // arg 传递给routine的参数,参数是void* 11 12 pthread_t pthread_self(void) //参考自己的TID
测试程序:
1、创建一个线程,参考线程的tid与pid
1 #include <pthread.h> 2 #include <stdio.h> 3 #include <string.h> 4 5 void *function1(void *arg) 6 { 7 printf("this is thread function1\n"); 8 } 9 10 int main() 11 { 12 pthread_t tid; 13 int err; 14 err = pthread_create(&tid, NULL, function1, NULL); 15 if(err!=0) 16 { 17 printf("create thread: %s\n",strerror(err)); 18 return -1; 19 } 20 21 sleep(2); //主进程退出太快,会导致子线程来不及打印 22 }
通过命令行查看线程
ps -eLf | grep xxxx
线程退出
如果进程中的任意线程调用了exit
、_Exit
、_exit
函数,那么整个进程就会终止。
那如何退出线程,又不影响其他人?
1.直接返回 return
2.被其他线程取消
3.线程自己调用pthread_exit
1 #include <pthread.h> 2 void pthread_exit(void *retval); 3 4 //retval:线程结束时的返回值,可通过pthread_join接收
线程回收
1 #include <pthread.h> 2 3 int pthread_join(pthread_t pthread, void **retval); 4 5 //成功返回0,失败返回错误码 6 //thread为要回收的线程对象 7 //调用线程阻塞直到thread结束 8 //*retval接收线程thread的返回值
测试程序:
1 #include <pthread.h> 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 6 void *funct(void *arg) 7 { 8 printf("this is thread funct\n"); 9 sleep(1); 10 pthread_exit("funct exit"); 11 } 12 13 int main() 14 { 15 int re,i; 16 pthread_t tid; 17 re = pthread_create(&tid, NULL, funct, (void*)i); 18 19 void *retval; 20 pthread_join(tid, &retval); 21 printf("retval=%s\n",(char *)retval); 22 sleep(2); //主进程退出太快,会导致子线程来不及打印 23 }
取消线程
线程的两种状态
线程的状态----joinable和detached