线程简单使用流程 :
① 线程方法准备 : 定义一个方法 , 主要使用其 方法名称 和 返回值 ;
//线程的主方法 , 类似于 Java 中的 run 方法 , C++ 中方法名随意 void* pushData(void*) { // ... }② 声明线程 ID : 线程 ID 类型是 pthread_t 类型的 , 其本质是 int 类型 ;
pthread_t pid_push;③ 创建线程并执行 : pthread_create() 方法时创建并启动线程 ;
//启动一个线程 , 无限循环 向线程安全队列中存储数据 pthread_create(&pid_push, 0, pushData, 0);该方法需要提供四个参数 :
参数 1 ( pthread_t *tidp ) :线程标识符指针 , 该指针指向线程标识符 ;参数 2 ( const pthread_attr_t *attr ) : 线程属性指针 ;参数 3 ( (void*)(*start_rtn)(void*) ) : 线程运行函数指针 , start_rtn 是一个函数指针 , 其参数和返回值类型是 void* 类型参数 4 ( void *arg ) : 参数 3 中的线程运行函数的参数 ;④ 等待线程执行完毕 : pthread_join (pthread_t thread, void **value_ptr)方法 , 等待 thread 线程 ID 代表的线程执行完毕 ;
//阻塞 , 等待其中任意一个线程执行完毕 , 实际上是一直在此阻塞 , 如果运行下去 主函数就暂停了 pthread_join(pid_push, 0);更多详细内容 ( 如线程属性设置等细节 ) 参考 下面的博客 : 【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 ) 【C++ 语言】Visual Studio 配置 POSIX 线程 ( Windows 不支持 POSIX | 配置文件下载 | 库文件说明 | 配置过程 )
互斥锁使用流程 :
① 声明互斥锁变量 :
//互斥锁变量 // 1. 先导入头文件 // 2. 定义互斥锁变量 // 3. 在构造函数中进行初始化 // 4. 在析构函数中释放 pthread_mutex_t mutex;② 初始化互斥锁 :
//初始化互斥锁 pthread_mutex_init(&mutex, 0);③ 上锁 :
//使用互斥锁将操作锁起来 pthread_mutex_lock(&mutex);④ 互斥操作 : 需要进行互斥的操作 , 放在 上锁 与 解锁之间进行 ;
⑤ 解锁 :
//解除互斥锁 锁定 pthread_mutex_unlock(&mutex);⑥ 销毁互斥锁 : 互斥锁使用完毕后进行销毁 ;
//释放互斥锁 pthread_mutex_destroy(&mutex);条件变量使用步骤 :
① 声明 条件变量 :
//条件变量 // 使用流程 : // 1. 在构造函数中进行初始化 // 2. 在析构函数中释放 pthread_cond_t cond;② 初始化 条件变量 : 一般在构造函数中执行 ;
//初始化条件变量 pthread_cond_init(&cond, 0);③ 阻塞线程 :
//阻塞等待 , 相当于 Java 中的 wait() 方法 pthread_cond_wait(&cond, &mutex);④ 解除线程阻塞 : 有两种方式 , 前者每次只能唤醒一个线程 , 并且无法确定唤醒哪个线程 ; 后者唤醒所有由 cond 条件变量阻塞的线程 ;
//方式 1 : 唤醒一个线程 , 唤醒哪个线程 是无法控制的 ; 该方法 相当于 Java 中的 notify() pthread_cond_signal(&cond); //方式 2 : 使用广播通知所有等待的线程 , 唤醒所有的线程 , 相当于 Java 中的 notifyAll pthread_cond_broadcast(&cond);⑤ 销毁 条件变量 : 一般在析构函数中进行 ;
//销毁条件变量 pthread_cond_destroy(&cond);下载完项目后 , 使用 Visual Studio 打开 , 注意需要配置 POSIX 线程库 ;
【Visual Studio】Visual Studio 2019 社区版 CMakeList 开发环境安装 ( 下载 | 安装相关组件 | 创建编译执行项目 | 错误处理 )
【Visual Studio 2019】创建 导入 CMake 项目
【C++ 语言】Visual Studio 配置 POSIX 线程 ( Windows 不支持 POSIX | 配置文件下载 | 库文件说明 | 配置过程 )