C++线程调用顺序的一些误区,以及线程资源的释放

devtools/2024/11/24 7:46:43/

1、 线程理解误区

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;
void* thread1_function(void* arg) {pthread_mutex_lock(&mutex1);pthread_mutex_lock(&mutex2);pthread_mutex_unlock(&mutex2);pthread_mutex_unlock(&mutex1);pthread_exit(NULL);
}
void* thread2_function(void* arg) {pthread_mutex_lock(&mutex2);pthread_mutex_lock(&mutex1);pthread_mutex_unlock(&mutex1);pthread_mutex_unlock(&mutex2);pthread_exit(NULL);
}
int main() {pthread_t thread1, thread2;int result1 = pthread_create(&thread1, NULL, thread1_function, NULL);int result2 = pthread_create(&thread2, NULL, thread2_function, NULL);if (result1 == 0 && result2 == 0) {// 尝试调用pthread_join等待线程结束,会阻塞pthread_join(thread1, NULL);pthread_join(thread2, NULL);printf("Threads joined successfully\n");} else {perror("Thread creation failed");}return 0;
}

表面上看:好像第一个线程创建后,马上就执行了,然后是第二个线程——然而事实上线程的调度是取决于操作系统的。

  • pthread_create(&thread1, NULL, thread1_function, NULL);只是创建了线程thread1,但这个线程并不一定会立即执行。
  • 很有可能thread1和thread2几乎同时开始执行,此时就形成了死锁。
  • 因为thread1在等待thread2释放mutex2,而thread2在等待thread1释放mutex1。

2、线程释放误区

int main() {pthread_t thread1, thread2;int result1 = pthread_create(&thread1, NULL, thread1_function, NULL);int result2 = pthread_create(&thread2, NULL, thread2_function, NULL);if (result1 == 0 && result2 == 0) {// 尝试调用pthread_join等待线程结束,会阻塞pthread_join(thread1, NULL);pthread_join(thread2, NULL);printf("Threads joined successfully\n");} else {perror("Thread creation failed");}return 0;
}

1、提示:如果线程形成了死锁,pthread_join方法的释放是会失败的。
2、pthread_join:等待一个线程结束,然后回收该线程所占用的资源。
3、pthread_join:会阻塞调用线程(这里是main),直到等待的线程结束。
4、线程结束:执行到函数末尾或者通过pthread_exit主动退出。
5、资源释放:线程结束时,操作系统会释放大多资源。pthread_join会做最后的清理工作。


http://www.ppmy.cn/devtools/136494.html

相关文章

Node.js笔记(三)局域网聊天室构建1

目标 用户与服务端建立通信&#xff0c;服务端能检测到用户端的连接信息 代码 JS部分<chatroom.js> const express require(express) const http require(http) const {Server} require(socket.io)const app express() const se…

开源宝藏:Smart-Admin 重复提交防护的 AOP 切面实现详解

首先&#xff0c;说下重复提交问题&#xff0c;基本上解决方案&#xff0c;核心都是根据URL、参数、token等&#xff0c;有一个唯一值检验是否重复提交。 而下面这个是根据用户id&#xff0c;唯一值进行判定&#xff0c;使用两种缓存方式&#xff0c;redis和caffeine&#xff…

2024亚太杯C题宠物行业及相关产业的发展分析和策略——成品参考思路模型代码

更多资源请关注下方名片获取 1 总体分析 1.1 问题背景&#xff1a; 随着人们消费理念的发展&#xff0c;宠物行业这一新兴产业在全球范围内逐渐兴起&#xff0c;得益于经济的快速发展和人均收入的提升。1992年&#xff0c;中国小动物保护协会成立&#xff0c;随后国际宠物品…

【Ubuntu】如何在Ubuntu系统中查看端口是否可用

文章目录 前言一、使用netstat命令二、使用ss命令三、使用lsof命令四、使用nc&#xff08;netcat&#xff09;命令总结 前言 本文介绍了如何在Ubuntu系统中查看端口是否可用的方法&#xff0c;并给出了具体的命令示例&#xff0c;帮助用户通过命令行工具检测端口的开放状态。 …

论文阅读:SIMBA: single-cell embedding along with features

Chen, H., Ryu, J., Vinyard, M.E. et al. SIMBA: single-cell embedding along with features. Nat Methods 21, 1003–1013 (2024). 论文地址&#xff1a;https://doi.org/10.1038/s41592-023-01899-8 代码地址&#xff1a;https://github.com/pinellolab/simba. 摘要 大多…

⭐️ GitHub Star 数量前十的工作流项目

文章开始前&#xff0c;我们先做个小调查&#xff1a;在日常工作中&#xff0c;你会使用自动化工作流工具吗&#xff1f;&#x1f64b; 事实上&#xff0c;工作流工具已经变成了提升效率的关键。其实在此之前我们已经写过一篇博客&#xff0c;跟大家分享五个好用的工作流工具。…

SpringBoot整合SpringSecurity实现一个简单的认证与授权应用

1、SpringSecurity 的简介 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架&#xff0c;它是 Spring 项目组中用来提供安全认证服务的框架&#xff0c;能够为基于 Sprin g的企业应用系统提供声明式的安全访问控制解决方案。 Spring Security 的前身是 A…

机器学习实战:银行客户是否认购定期存款

项目结构与步骤 1. 项目概述 项目名称&#xff1a;葡萄牙银行电话营销活动分析与定期存款认购预测目标&#xff1a;通过分析银行的电话营销数据&#xff0c;构建模型预测客户是否会认购定期存款。数据来源&#xff1a;葡萄牙银行营销活动数据集关键挑战&#xff1a;数据不平衡…