• Linux C应用编程-5-线程


    各线程共享的进程资源和环境

    • 进程同一地址空间
    • 同一进程定义的函数和全局变量
    • 文件描述符表
    • 每种信号的处理方式(SIG_IGNSIG_DFL或者自定义的信号处理函数)
    • 当前工作目录
    • 用户id和组id

    线程各自独立的资源

    • 线程id
    • 上下文,包括各种寄存器的值、程序计数器和栈指针
    • 栈空间
    • errno变量
    • 信号屏蔽字
    • 调度优先级

    1.创建线程

    1. #include
    2. #include
    3. //线程所需要的头文件
    4. #include
    5. //getpid需要的头文件
    6. #include
    7. //线程编译需要加上-lpthread
    8. int temp = 0;
    9. void printids(char *s)
    10. {
    11. pid_t pid;
    12. pthread_t tid;
    13. pid = getpid();
    14. tid = pthread_self();//获取当前线程id
    15. //由于pthread_t并不是一个整型,所以需要做强制类型转换
    16. printf("%s pid:%d, tid:%u\n", s, pid, (unsigned int)tid);
    17. }
    18. //线程处理函数
    19. void *thread_handler(void *arg)
    20. {
    21. static int value = 0;
    22. temp++; //线程间共享全局变量、局部变量、函数
    23. value++;
    24. printf("%s value:%d, temp:%d\n", (char*)arg, value, temp);
    25. printids(arg);
    26. return NULL;
    27. }
    28. int main(void)
    29. {
    30. pthread_t tid;
    31. int err;
    32. /*
    33. * 返回线程id
    34. * 线程属性设置
    35. * 线程处理函数
    36. * 线程处理函数参数
    37. */
    38. err = pthread_create(&tid, NULL, thread_handler, "new_thread1");
    39. //pthread_create失败返回错误码
    40. if (err != 0) {
    41. //由于pthread_create的错误码不保存在errno中,因此不能直接用perror()打印错误信息
    42. fprintf(stderr, "pthread_create1\n");
    43. exit(1);
    44. }
    45. printf("create tid %u\n", (unsigned int)tid);
    46. err = pthread_create(&tid, NULL, thread_handler, "new_thread2");
    47. //pthread_create失败返回错误码
    48. if (err != 0) {
    49. //由于pthread_create的错误码不保存在errno中,因此不能直接用perror()打印错误信息
    50. fprintf(stderr, "pthread_create2\n");
    51. exit(1);
    52. }
    53. printf("create tid %u\n", (unsigned int)tid);
    54. printids("main_thread");
    55. sleep(2);//预留线程调度的时间
    56. return 0;
    57. }

    2.终止线程

    只终止某个线程可以有三种方法:

    • 从线程函数return。这种方法对主线程不适用,从main函数return相当于调用exit
    • 一个线程可以调用pthread_cancel终止同一进程中的另一个线程。
    • 线程可以调用pthread_exit终止自己。

    1)终止某个线程

    1. #include
    2. void pthread_exit(void *value_ptr);
    3. /*
    4. 成功返回0,失败返回错误号
    5. */

    2)自身线程挂起

  • 相关阅读:
    Docker发布简单springboot项目
    logcat 只打印符合包名的log
    低代码:让软件开发不再遥不可及
    【零基础入门SpringMVC】第一期——开篇导论
    【HDU No. 1043】 八数码 Eight
    -----指针进阶
    正则表达式基本语法
    入门力扣自学笔记112 C++ (题目编号899)
    Windows 安装DotNet Core运行时库
    python paramiko模块
  • 原文地址:https://blog.csdn.net/irainsa/article/details/128022371