linux 下多线程的编程基本属于即开即用的情况,在这里主要介绍win 下的多线程编程。

如果不知道怎么配置win下 pthread.h 的环境可以参考下面的文章, 傻瓜式点对点的告诉你在 VS2017 编辑器下怎么配置 phread.h (PS: 这也是我写的)


基本概念

  • 什么是线程?

首先线程是包含在进程内。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务,线程之间资源是共享的。

  • 多线程的优势?

如果只有一个线程,那么任务就是顺序执行的,你必须等待前面的任务完成,才能执行下一个任务。引入多线程则可以在你执行某个任务的过程中,执行其他任务。所以在耗时多任务中,应用非常广泛。

代码介绍

pthread_create

简述:创建线程。

第一个参数为指向线程标识符的指针。

第二个参数用来设置线程属性。

第三个参数是线程运行函数的起始地址。

最后一个参数是运行函数的参数。

  1. int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,
  2. (void*)(*start_rtn)(void*),void *arg);

pthread_exit

简述:调用这个函数可以显示得退出线程

  1. void pthread_exitvoid *retval);

pthread_join

简述:用来等待一个线程的结束, 使一个线程等待另一个线程结束,主要于线程间同步的操作。不使用的话,该线程结束后并不会释放其内存空间,这会导致该线程变成了 “僵尸线程”。

thread: 线程标识符,即线程 ID,标识唯一线程。

retval: 用户定义的指针

  1. int pthread_join(pthread_t thread, void **retval);

pthread_detach

简述:主线程与子线程分离,子线程结束后,资源自动回收。pthread_join() 函数的替代函数。如果 tid 尚未终止,pthread_detach() 不会终止该线程。

  1. int pthread_join(pthread_t thread, void **retval);

举例

  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <time.h>
  4. #include <windows.h>//使用Sleep的头
  5. int g_number = 0;
  6. #define MAX_COUNT 10000
  7. //pthread_mutex_t mut;
  8. void *counter3(void* args) {
  9. int i = 1;
  10. while (i <= MAX_COUNT / 4) {
  11. //pthread_mutex_lock(&mut);
  12. g_number++;
  13. //pthread_mutex_unlock(&mut);
  14. printf("hi,i am pthread 3, my g_number is [%d]\n", g_number);
  15. Sleep(1);// 单位ms
  16. i++;
  17. }
  18. }
  19. void *counter4(void* args) {
  20. int j = 1;
  21. while (j <= MAX_COUNT / 4) {
  22. //pthread_mutex_lock(&mut);
  23. g_number++;
  24. //pthread_mutex_unlock(&mut);
  25. printf("hi,i am pthread 4, my g_number is [%d]\n", g_number);
  26. Sleep(1);
  27. j++;
  28. }
  29. }
  30. int main() {
  31. //pthread_mutex_init(&mut, NULL);
  32. pthread_t t3;
  33. pthread_t t4;
  34. pthread_create(&t3, NULL, counter3, NULL);
  35. pthread_create(&t4, NULL, counter4, NULL);
  36. getchar();
  37. return 0;
  38. }

输出

C语言多线程编程(一) - 知乎 - 图1

留下个几个思考题:

1、为什么少加了几个?根本原因是什么?

2、怎么通过更改 代码的判断条件或者 sleep 或者 pthread_mutex_lock 去解决这个问题,让他输出为 5000?哪种方法更好?

3、写个 for 循环 5000 次 + sleep(1) 看看耗时多少,对比多线程和单线程时间的差异。


https://zhuanlan.zhihu.com/p/97418361