线程

时间:2019-12-26
本文章向大家介绍线程,主要包括线程使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

------------恢复内容开始------------

进程的特点:

  进程有独立地地址空间。

  LINUX为每个进程创建task_struct

  每个进程都参与内核调度,互不影响

线程的特点:

  进程在切换时,系统开销大,引入轻量级进程LWP

  同一进程中的线程共享相同的地址空间

  Linux不区分进程,线程

  通常线程指共享地址空间的多个任务

  线程提高任务切换效率,避免额外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 }
exit / join

取消线程

 

------------恢复内容结束------------

原文地址:https://www.cnblogs.com/y4247464/p/12102078.html