c主线程如何等待子线程结束 linux_使用互斥量进行同步 - Linux C进程与多线程入门_Linux编程_Linux公社-Linux系统门户网站...

news/2024/5/20 1:55:02/文章来源:https://blog.csdn.net/weixin_39758696/article/details/114492439

互斥

简单地理解就是,一个线程进入工作区后,如果有其他线程想要进入工作区,它就会进入等待状态,要等待工作区内的线程结束后才可以进入。

基本函数

(1) pthread_mutex_init函数

原型:int pthread_mutex_init ( pthread_mutex_t *mutex, const pthread_mutexattr_t* attr);

描述:设置互斥量的属性

参数:第一个参数:预先声明的pthread_mutex_t对象指针

第二个参数:互斥锁属性,NULL表示使用默认属性

返回值:成功时返回0, 失败时返回一个错误代码

(2) pthread_mutex_lock函数

原型:int pthread_mutex_lock ( pthread_mutex_t *mutex );

描述:pthread_mutex_lock返回时,互斥锁被锁定,如果这个互斥锁被一个线程锁定和拥有,那么另一个线程要调用这 个函数会进入堵塞状态(即等待状态),直到互斥锁被释放为止。

返回值:成功时返回0, 失败时返回一个错误代码

(3) pthread_mutex_unlock函数

原型:int pthread_mutex_unlock ( pthread_mutex_t *mutex );

描述:释放互斥锁

返回值:成功时返回0, 失败时返回一个错误代码

(4) pthread_mutex_destroy函数

原型:int pthread_mutex_destroy ( pthread_mutex_t *mutex );

描述:删除互斥锁

返回值:成功时返回0, 失败时返回一个错误代码

实例

lock.c文件

描述:这个程序主要可以概括为主线程负责接受输入的字符串,而子线程则负责统计并输出字符数。

#include

#include

#include

#include

#include

void *thread_function(void *arg);

pthread_mutex_t work_mutex;

#define WORK_SIZE 1024

char work_area[WORK_SIZE];

int time_to_exit = 0;

int main() {

int res;

pthread_t a_thread;

void *thread_result;

/*初始化互斥量*/

res = pthread_mutex_init(&work_mutex, NULL);

if (res != 0) {

perror("互斥量初始化失败!");

exit(EXIT_FAILURE);

}

/*启动新线程*/

res = pthread_create(&a_thread, NULL, thread_function, NULL);

if (res != 0) {

perror("线程创建失败");

exit(EXIT_FAILURE);

}

pthread_mutex_lock(&work_mutex);

printf("请输入一些文本内容. 输入“end”结束\n");

while(!time_to_exit) {

fgets(work_area, WORK_SIZE, stdin);

pthread_mutex_unlock(&work_mutex);

while(1) {

pthread_mutex_lock(&work_mutex);

/*统计字符工作未完成*/

if (work_area[0] != '\0') {

pthread_mutex_unlock(&work_mutex);

sleep(1);

}

else {

/*统计字符工作完成,跳出内层循环,重新读取输入*/

break;

}

}

}

pthread_mutex_unlock(&work_mutex);

printf("\n等待线程结束...\n");

res = pthread_join(a_thread, &thread_result);

if (res != 0) {

perror("Thread join failed");

exit(EXIT_FAILURE);

}

printf("Thread joined\n");

pthread_mutex_destroy(&work_mutex);

exit(EXIT_SUCCESS);

}

/*主线程首先锁定工作区,在获取输入的字符后,释放工作区,让其他线程对字符个数进行统计。work_area[0[为空字符时表示统计结束。通过周期性地对互斥量进行加锁,检查是否已经统计完。*/

/*在线程中要执行的代码*/

void *thread_function(void *arg) {

sleep(1);

pthread_mutex_lock(&work_mutex);

while(strncmp("end", work_area, 3) != 0) {

printf("你输入了 %d 个字符\n", strlen(work_area) -1);

work_area[0] = '\0';

pthread_mutex_unlock(&work_mutex);

sleep(1);

pthread_mutex_lock(&work_mutex);

while (work_area[0] == '\0' ) {

pthread_mutex_unlock(&work_mutex);

sleep(1);

pthread_mutex_lock(&work_mutex);

}

}

time_to_exit = 1;

work_area[0] = '\0';

pthread_mutex_unlock(&work_mutex);

pthread_exit(0);

}

/*在新线程一上来先试图对互斥量进行加锁。如果它已经被锁上,新线程就会进入堵塞状态知道互斥锁释放为止,一旦可以进入工作区,就先检查是否有退出请求(end)如果有,就设置time_to_exit变量和work_area,然后退出程序。

如果没有退出,那么就对字符个数进行统计。把work_area[0]设置为空,表示统计工作完成。接下来就释放互斥锁,等待主线程的运行,周期性地给互斥量加锁,如果加锁成功,就检查主线程是否又给我们新的字符串统计。如果没有,就释放互斥锁继续等待,*/

编译执行:gcc -D_REENTRANT fork.c -o fork -lpthread

运行结果如下:

d17d9ce5dbdd815a8a9c96a36c310170.png

���考文献:Linux程序设计

0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_706882.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xshell搭建宝塔没有远程命令密码框框弹出来_服务器安装宝塔控制面板+wordpress搭建个人网站...

准备工作服务器一台:服务器购买域名一个:随便买一个就行软件环境:宝塔面板第1步:SSH远程连接服务器通过ssh远程连接工具进行服务器主机连接(Xshell、Putty等,百度下载)需要更加详细的关于ssh远程…

php教育网站设计案例_酒店装修,精品酒店设计装修案例,酒店设计网站

酒店设计需要考虑:设计酒店的时候也要顺应市场潮流,不再单一的提供休息、洗漱、睡觉的空间,还要能提供社交、商务等功能,同顾客产生情况共鸣。这样能够引领生活方式的、能够互动,有仪式感的酒店,是很吸引人…

html5手机电商网页设计代码_Html5网站制作,干货!20个视觉体验和内容俱佳的优秀网页设计...

如何创建一个网页?“Html5网站制作”和“灵感干货!20个视觉、体验和内容俱佳的优秀网页设计”有什么关系和内在关联?在图片方面,有三个具体方案:图片地图、Css Sprites、内联图片三种,最值得关注的是 Css S…

asp网站本地测试服务器,小旋风asp服务器,asp本地环境调试必备

学习asp,要在本地搭建一个asp服务器调试环境吧,那么必不可少的要找asp本地调试环境软件,超级小旋风AspWebServer是一个不错的选择。超级小旋风AspWebServer系统基于NetBox开发,可以跟IIS媲美的服务器。小旋风asp服务器 该软件是由…

将虚拟主机加入到netskills.net域环境_网站建设阿里云虚拟主机、ECS服务器、企业邮箱选择购买指南...

对于刚接触阿里云的人来说可能看到阿里云的产品介绍页面会比较头晕,各种产品分类,而且同一个产品在不同的分类目录下都能看到,下面简单介绍一下制作网站过程中常用的阿里云的产品。阿里云在网站建设方面常用的服务主要有云虚拟主机、ECS云服务…

seo黑帽劫持用的php,黑帽seo 论坛:黑帽seo防止网站被k的js劫持跳转代码

由于目前百度搜索百度搜索引擎对于js代码还没有办法完全辨别,因此也就出现了运用js代码跳转的黑帽优化提升手法。现如今在网络上有关js跳转代码不计其数,但是作为黑帽优化提升的seo手法之一,如何确保有效降低跳转的网址被k危害性,…

本机用域名不能访问_域名注册申请网站域名注意事项

互联网用户越来越多,也有越来越多人搭建网站,做个人博客也好、搭建企业官网也好,数量都在逐步上升。做网站的数量在上升,域名注册量肯定也在上升。有的朋友头一次注册域名,对域名不了解也不知道申请网站域名该注意哪些…

eclipse的tomcat如何运行自动弹网页_4个国外网页设计网站案例欣赏

原标题:4个国外网页设计网站案例欣赏要想把自己的网站制作得更加美观、吸引人,你需要多参考一些高质量的网站设计案例。今天就给大家看几个比较好的国外网页设计网站,你可以从中学习这些国外网页设计的思路。1.礼盒电商网站如何让自己的网站更…

vue seo关键词设置_SEO关键词优化排名的几个技巧

关键词是优化网站必须要思考分析的,SEO网站优化过程中,网站的文章内容及标题优化,那么必须要考虑到网站的主关键词与长尾关键词了。那么,SEO关键词优化排名的技巧有哪些?下面眼前一亮就跟大家分享下SEO关键词快速排名技…

未备案域名临时跳过备案提示_做好了网页,有域名和服务器,还要怎么搭建网站?...

不知道你选择的服务器是国内大陆的还是国外或者香港的,如果是国内大陆的服务器我们的网站域名还需要备案,你的服务器提供商是那家就在那家备案,备案流程跟着提示走就可以了,接下来我们开始正式进入将网站三要素(域名、…

angular语言前端开发_web前端开发入门全套学习方法路径,兼职在家做网站也能月入上万...

前端学习路径1.WEB前端快速入门在本阶段,我们需要掌握 HTML 与 CSS 基础,当然,也包含 H5 和 C3 的新特性。这个部分内容非常简单,而且非常容易掌握。相信你也更愿意学习这个部分,毕竟他可以让你最直观的感受到前端的魅…

h5首页加载慢_H5网站制作注意了

H5自适应网站越来越受到企业的追捧,不同于原来的建站模式,H5网站可以很好是调整来达到PC端和移动端的良好展示效果,获得更友好用户体验。H5网站作为网站优化人员,小编第一个想到的并不是H5带来的炫酷效果,认识它解决了…

网站搭建从零开始(三)域名解析

前面介绍了网站搭建所需要的两大要素:域名和服务器,这次要说的是域名解析,也就是把域名和服务器进行绑定的过程。 我们在访问网络时,网址会被发送到DNS服务器,然后由DNS服务器返回我们所要访问的服务器IP地址&#xff…

网站搭建从零开始(四) 服务器的配置

域名解析设置好了,通常我们就可以访问我们的站点了,上篇里面没有详细讲服务器绑定域名的过程,可能不够清楚,这篇里面再做一下介绍。同时对服务器端的配置进行介绍(由于各种服务器各不相同,这里也没法一一介…

网站搭建从零开始(五) WordPress的安装

前面说了很多废话,现在终于转到正题,WordPress的安装。 1、WordPress安装很简单 如果你的服务器能通过应用中心一键安装WordPress,这一节就很轻松了,基本上不需要做什么。但是考虑到那种新手的方式,以后如果换了服务器…

网站搭建从零开始(六) WordPress的基本配置

上一篇里,我们一起安装好了WordPress,成功的搭建了我们的网站。 WordPress框架特点 WordPress是一个被广泛使用的网站框架,主要用于博客类网站,但也被一些站点做成资讯类网站、购物网站等。 类似WordPress,也有一些其他…

用asp.net 2.0实现网站二级域名(转)

以下是以www.域名.com这个域名为例,让每个注册用户都有自已的二级域名,其中abc.域名.com就是要用到的二级域名基本思路:1. 域名支持泛解析,即是指:把A记录 *.域名.com 解析到服务器IP,服务器IIS中做绑定&…

“拯救网站运维经理赵明”有奖方案征集启事

【51CTO.com独家策划】做网站运维的人都或多或少有过感慨,平时各种故障就很让人抓狂了。更别说遇上***了!不过兵来将挡,水来土掩。有攻就有防。网站怎么做防护?大家需要什么样的技术和产品?咱们不妨来看看51CTO独家视频…

ASP.NET夜话之21:asp.net网站的性能优化

本篇主要讲述在ASP.NET中如何提高程序性能。提高程序性能的方法主要从编码和数据操作及优化配置三方面,本章要讲述的知识点有:l 程序编码优化l 数据操作优化l 配置优化l 总结21.1 程序编码优化 从编码方面提高程序性能的方法主要涉及到集合操作、字符串…

网站用户登录验证:Servlet+JSP VS Struts书剑恩仇录

? 什么是Struts框架 –从不同的角度看待Struts框架 –Struts框架的优点 ? 下载安装Struts框架 –下载配置Struts框架 –测试Struts框架 –安装Struts应用程序 –访问Struts文档 ? Struts 中常用组件 –ActionServlet –Action –ActionForm –ActionMapping –ActionForward…