当前位置:   article > 正文

线程简介及其函数使用实例(gcc *.c -lpthread)

线程简介及其函数使用实例(gcc *.c -lpthread)

1.概念

线程(LWP(Light Weight process))

          线程是轻量级的进程,(是比进程粒度更小的执行单元)进程是分配资源的最小单位(0-3G)(PS:一辆马车8匹马 进程 其中的一个马是线程),线程是调度(PS:或执行)的最小单位。线程本身不占用资源它是共享进程的资源(PS:一个进程中的许多线程 共享一个进程的0-3G空间)。线程没有进程安全,(PS:考虑安全 选择多进程,考虑并发性 选多线程因为如果一个线程导致进程结束,其他所有的线程都不能执行。多线程的并发性比多进程的高,因为线程间切换比进程间切换时间短。线程间资源共享(PS:一个进程的全局变量 其中的线程能全部共享),所以线程间通信要比进程间通信更为容易。

  1. ps -ajx ==>看进程附加态(状态带(小L)l,代表多线程)
  2. ps -eLf ==>多线程
  3. htop ==>多线程

2.线程接口提供方式

多线程创建的接口是第三方库提供的libpthread.so,在编译的时候就必须链接这个库gcc xxx.c -lpthread,man手册需要使用apt-get来安装(sudo apt-get install manpages-*)。

3.线程创建使用到的函数

  1. #include <pthread.h>
  2. int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
  3. void *(*start_routine) (void *), void *arg);
  4. 功能:创建一个线程
  5. 参数:
  6. @thread:线程号
  7. @attr:线程属性,使用默认值NULL (PS线程属性:https://docs.oracle.com/cd/E19253-01/819-7051/6n919hpaa/index.html)
  8. @start_routine:线程处理函数(线程体)
  9. @arg:给线程处理函数传参(PS:多参数 可用结构体传参)
  10. 返回值:成功返回0,失败返回错误码
  11. Compile and link with -lpthread.
  12. (PS:编译的时候 要链接这个库,gcc xxx.c -lpthread)

4.多线程创建实例 (gcc 01thread.c -lpthread编译)

01thread.c

  1. #include <head.h>
  2. void * thread(void *arg){
  3. printf("子线程...\n");
  4. }
  5. int main(int argc,const char * argv[])
  6. {
  7. pthread_t tid;
  8. if((errno=(pthread_create(&tid,NULL,thread,NULL))!=0)){
  9. perror("pthread_create error");
  10. exit(-1); //pthread_create函数成功返回0
  11. }
  12. printf("主线程...\n");
  13. sleep(1);//不能让进程退出 线程退出了 线程就没有执行的内存了
  14. return 0;
  15. }

5.多线程创建实例 (gcc 02thread.c -lpthread编译)

02thread.c

  1. #include <head.h>
  2. void *thread(void *arg)
  3. {
  4. int a = *(int *)arg;
  5. printf("a = %d\n", a);
  6. printf("子线程...\n");
  7. }
  8. int main(int argc, const char *argv[])
  9. {
  10. pthread_t tid;
  11. int num = 100;
  12. if ((errno = (pthread_create(&tid, NULL, thread, (void *)&num)) != 0))
  13. {
  14. perror("pthread_create error");
  15. exit(-1); // pthread_create函数成功返回0
  16. }
  17. printf("主线程...\n");
  18. sleep(1); // 不能让进程退出 线程退出了 线程就没有执行的内存了
  19. return 0;
  20. }

6.多线程执行顺序问题

多线程执行没有先后顺序、时间片轮询,上下文切换

7.多线程占用内存问题

多线程可以共享全局变量,每个线程都可以对此全局变量进行读写操作(全局变量可以被多线程贡共享)

  1. #include <head.h>
  2. int B = 10;
  3. void *thread1(void *arg)
  4. {
  5. printf("子线程1...\n");
  6. while (1)
  7. {
  8. B++;
  9. sleep(1);
  10. }
  11. }
  12. void *thread2(void *arg)
  13. {
  14. printf("子线程2...\n");
  15. while (1)
  16. {
  17. printf("B= %d\n", B);
  18. sleep(1);
  19. }
  20. }
  21. int main(int argc, const char *argv[])
  22. {
  23. pthread_t tid1, tid2;
  24. if ((errno = (pthread_create(&tid1, NULL, thread1, NULL)) != 0))
  25. {
  26. perror("pthread_create error");
  27. exit(-1); // pthread_create函数成功返回0
  28. }
  29. if ((errno = (pthread_create(&tid2, NULL, thread2, NULL)) != 0))
  30. {
  31. perror("pthread_create error");
  32. exit(-1); // pthread_create函数成功返回0
  33. }
  34. printf("主线程...\n");
  35. while (1)
  36. {
  37. }
  38. // 不能让进程退出 线程退出了 线程就没有执行的内存了
  39. return 0;
  40. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号