C++ pthread 多线程

本篇是我在学习C++多线程的时候做的笔记,主要记录的是基础的流程,部分代码实例,以及重点函数的说明。



pthread 入口函数类型说明

void * func1(void * t)

void* 表示无类型指针

void*作为函数参数,表示函数接收一个指针,不管是什么类型的指针都可以,但是传递之前要强制转换为无类型指针。
基础流程

pthread_t t1;//声明一个线程
pthread_create(&t1, NULL, &test, (void *)this);//创建一个线程
pthread_exit(NULL);//退出线程

pthread_create() 函数原型

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                            void *(*start_routine) (void *), void *arg);

含有四个参数,

    第一个参数表示线程id
    第二个参数表示线程参数
    第三个是线程的入口函数名字
    第四个参数表示线程入口函数的参数名字

pthread_exit();

函数原型

void  pthread_exit(void  *retval)

写在线程内部,用于强制退出当前线程

如果线程是joinable,可以在函数参数里面传递线程的退出信息给主线程

例如

#include <pthread.h>
#include <iostream>

using namespace std;

void *thread1(void *);
int status;
int main(void)
{
    void *status_m;
    cout << "status_m addr is " << &status_m << endl;
    pthread_t t_a;
    pthread_create(&t_a,NULL,thread1,NULL);/*创建进程t_a*/
    pthread_join(t_a, &status_m);/*等待进程t_a结束*/
    cout << "status_m value is " << status_m << endl;
    int * re=(int *)status_m;
    cout << "the value is " << *re << endl;
    return 0;
}
void *thread1(void *junk)
{
    status=23333;
    cout << "status addr is " << &status << endl;
    pthread_exit((void *)&status);
}

可以打印出

status_m addr is 0x7ffe3cfd6170
status addr is 0x6021b4
status_m value is 0x6021b4
the value is 23333

线程的joinable和detached属性

属性的设置方法如下

  1. pthread_attr_t attr;//声明一个参数
  2. pthread_attr_init(&attr);//对参数进行初始化
  3. pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);//设置线程为可连接的
  4. pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//设置线程为可分离的
  5. pthread_attr_destroy(&attr)//销毁属性,防止内存泄漏

属性的相关操作如下:

pthread_detach()

函数原型

  1. int pthread_detach(pthread_t tid);

detached的线程在结束的时候会自动释放线程所占用的资源

pthread_join()

函数原型

  1. int pthread_join(pthread_t tid, void **status);

joinable的线程必须用pthread_join()函数来释放线程所占用的资源,如果没有执行这个函数,那么线程的资源永远得不到释放。
互斥锁 mutex

互斥锁是为了多个线程在运行过程中保持数据同步引入的机制。

基本流程

  1. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/
  2. pthread_mutex_init(&mutex,NULL);/*动态初始化互斥锁*/
  3. pthread_mutex_lock(&mutex);//加锁
  4. pthread_mutex_unlock(&mutex);//解锁
  5. pthread_mutex_destroy(&mutex);//销毁互斥锁

举个例子

  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. pthread_mutex_t mutex ;
  5. void *print_msg(void *arg){
  6.         int i=0;
  7.         pthread_mutex_lock(&mutex);
  8.         for(i=0;i<15;i++){
  9.                 printf("output : %d\n",i);
  10.                 usleep(100);
  11.         }
  12.         pthread_mutex_unlock(&mutex);
  13. }
  14. int main(int argc,char** argv){
  15.         pthread_t id1;
  16.         pthread_t id2;
  17.         pthread_mutex_init(&mutex,NULL);
  18.         pthread_create(&id1,NULL,print_msg,NULL);
  19.         pthread_create(&id2,NULL,print_msg,NULL);
  20.         pthread_join(id1,NULL);
  21.         pthread_join(id2,NULL);
  22.         pthread_mutex_destroy(&mutex);
  23.         return 1;
  24. }

条件变量

基本流程

  1. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/
  2. pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化条件变量*/
  3. pthread_mutex_lock(&mutex);/*锁住互斥量*/
  4. pthread_cond_signal(&cond);//发送信号量 跟wait函数不在同一个线程中
  5. pthread_cond_wait(&cond,&mutex);//阻塞线程,等待条件变量,同时解锁互斥量
  6. pthread_mutex_unlock(&mutex);//解锁互斥量
  7. pthread_mutex_destroy(&mutex);//销毁互斥锁
  8. pthread_cond_destroy(&cond);//销毁条件变量

举个例子

  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/
  6. pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化条件变量*/
  7. void *thread1(void *);
  8. void *thread2(void *);
  9. int i=1;
  10. int main(void)
  11. {
  12.     pthread_t t_a;
  13.     pthread_t t_b;
  14.     pthread_create(&t_a,NULL,thread1,(void *)NULL);/*创建进程t_a*/
  15.     pthread_create(&t_b,NULL,thread2,(void *)NULL); /*创建进程t_b*/
  16.     pthread_join(t_a, NULL);/*等待进程t_a结束*/
  17.     pthread_join(t_b, NULL);/*等待进程t_b结束*/
  18.     pthread_mutex_destroy(&mutex);
  19.     pthread_cond_destroy(&cond);
  20.     exit(0);
  21. }
  22. void *thread1(void *junk)
  23. {
  24.     for(i=1;i<=6;i++)
  25.     {
  26.         printf("thread1: Line: %d, i = %d\n", __LINE__, i);
  27.         pthread_mutex_lock(&mutex);/*锁住互斥量*/
  28.         printf("thread1: lock %d\n", __LINE__);
  29.         if(i%3==0)
  30.         {
  31.             printf("thread1:signal 1 %d\n", __LINE__);
  32.             pthread_cond_signal(&cond);/*条件改变,发送信号,通知t_b进程*/
  33.             printf("thread1:signal 2 %d\n", __LINE__);
  34.             printf("%s will sleep 1s in Line: %d \n", __FUNCTION__, __LINE__);
  35.             sleep(1);
  36.         }
  37.         pthread_mutex_unlock(&mutex);/*解锁互斥量*/
  38.         printf("thread1: unlock %d\n", __LINE__);
  39.         printf("%s will sleep 1s in Line: %d \n\n", __FUNCTION__, __LINE__);
  40.         sleep(1);
  41.     }
  42. }
  43. void *thread2(void *junk)
  44. {
  45.     while(i<6)
  46.     {
  47.         printf("thread2: Line: %d, i = %d\n", __LINE__, i);
  48.         pthread_mutex_lock(&mutex);
  49.         printf("thread2: lock %d\n", __LINE__);
  50.         if(i%3!=0)
  51.         {
  52.             printf("thread2: wait 1 %d\n", __LINE__);
  53.             pthread_cond_wait(&cond,&mutex);/*解锁mutex,并等待cond改变*/
  54.             printf("thread2: wait 2 %d\n", __LINE__);
  55.         }
  56.         pthread_mutex_unlock(&mutex);
  57.         printf("thread2: unlock %d\n", __LINE__);
  58.         printf("%s will sleep 1s in Line: %d \n\n", __FUNCTION__, __LINE__);
  59.         sleep(1);
  60.     }
  61. }

结果为:

  1. thread1: Line: 29, i = 1
  2. thread1: lock 31
  3. thread1: unlock 41
  4. thread1 will sleep 1s in Line: 42
  5. thread2: Line: 52, i = 1
  6. thread2: lock 54
  7. thread2: wait 1 57
  8. thread1: Line: 29, i = 2
  9. thread1: lock 31
  10. thread1: unlock 41
  11. thread1 will sleep 1s in Line: 42
  12. thread1: Line: 29, i = 3
  13. thread1: lock 31
  14. thread1:signal 1 34
  15. thread1:signal 2 36
  16. thread1 will sleep 1s in Line: 37
  17. thread1: unlock 41
  18. thread1 will sleep 1s in Line: 42
  19. thread2: wait 2 59
  20. thread2: unlock 62
  21. thread2 will sleep 1s in Line: 63
  22. thread1: Line: 29, i = 4
  23. thread1: lock 31
  24. thread1: unlock 41
  25. thread1 will sleep 1s in Line: 42
  26. thread2: Line: 52, i = 4
  27. thread2: lock 54
  28. thread2: wait 1 57
  29. thread1: Line: 29, i = 5
  30. thread1: lock 31
  31. thread1: unlock 41
  32. thread1 will sleep 1s in Line: 42
  33. thread1: Line: 29, i = 6
  34. thread1: lock 31
  35. thread1:signal 1 34
  36. thread1:signal 2 36
  37. thread1 will sleep 1s in Line: 37
  38. thread1: unlock 41
  39. thread2: wait 2 59
  40. thread2: unlock 62
  41. thread2 will sleep 1s in Line: 63
  42. thread1 will sleep 1s in Line: 42

注意:thread2 wait 1和thread2 wait 2的位置可以知道wait函数在执行的时候会阻塞thread2,并且解锁互斥量

原文链接:https://blog.csdn.net/u013894427/article/details/83827173

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值