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

互斥

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

基本函数

(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.mzph.cn/news/245672.shtml

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

相关文章

电脑声音太小如何增强_感觉手机音量太小了?教你这样设置,声音立马大上许多...

不管是打电话,还是看电视,如果觉得手机的声音太小了,总会感到听起来很吃力,那么我们遇到这种情况,可以怎么办呢?建议大家看看下面这个方法,或许会让你的手机音量瞬间变大。1、打开单声道音频如今…

java 8时间操作_Java8 时间日期类操作

Java8 时间日期类操作Java8的时间类有两个重要的特性线程安全不可变类,返回的都是新的对象显然,该特性解决了原来java.util.Date类与SimpleDateFormat线程不安全的问题。同时Java8的时间类提供了诸多内置方法,方便了对时间进行相应的操作。上…

java虚拟机_一文彻底读懂Java虚拟机!(JVM)

提到Java虚拟机(JVM),可能大部分人的第一印象是“难”,但当让我们真正走入“JVM世界”的时候,会发现其实问题并不像我们想象中的那么复杂。唯一真正令我们恐惧的,其实是恐惧本身。而作为整个JVM系列的首篇,本文将带你解…

如何把一个软件嵌入另一个软件_新增一个软件一个游戏

今后会不定时增加付费软件的试用,如果大家有希望选购的IOS软件可留言。如果各位觉得软件好用,请去App Store购买支持开发者。MaginNote 3 (¥88)简介:MarginNote 3,全新上线电子阅读器,助力更高效书籍阅读和学习.革新性整合阅读标注…

java图书管理系统技术难度_Java图书管理系统练习程序(一)

Java图书管理系统练习程序第一部分该部分主要实现命令行方式的界面与无数据库访问的练习,通过本练习、主要掌握Java的基础知识与面向对象程序设计思想、面向接口编程技术的知识与运用。一、练习程序功能分析该练习程序主要用于学习Java的基础编程知识与面向接口编程…

java语言_JAVA语言

Java(计算机编程语言)JavaEE:12天掌握Java语言开发 - Java-环境搭建及基础语法 - 创客学院直播室Java是一门面向对象编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念,因此Jav…

linux关机_强制关机对电脑有什么危害?

强制按下关机键对电脑有什么影响?首先我们来了解下强制按下关机和正常关机的流程有什么区别:比较上面这两个流程图我们可以发现正常关机系统关机流程硬件关机流程。强制关机则缺少了系统关机流程这个部分,仅仅执行了硬件关机的这个流程。虽然…

14英寸电脑长宽多少_连接4K显示器流行,带雷电3雷电4接口的笔记本要多少钱?...

我们都知道,现在很多笔记本电脑都具备了4K 60p视频的播放能力,效果不俗,但笔记本本身屏幕是4K的比较少,并且也没那么大,连接显示器成了必须。而说到接口中,现在最时髦的要数雷电3、雷电4了,达到…

access建立两个字段唯一索引_数据库索引原理及优化

微信公众号:云计算通俗讲义持续输出技术干货,欢迎关注!通过本文你将了解:概述分类索引底层实现原理基本操作索引失效索引优化01 概述索引是帮助MySQL高效获取数据的排好序的数据结构,用于快速找出某个列中有一特定值的…

域用户频繁被锁定怎么解决_视频素材太多怎么办?看Mac用户如何使用NAS解决存储难题...

为什么需要一台NAS?在如今这个信息大爆炸的时代,指数级增长的图片、视频、文件,推动人们产生了对数据储存和管理的巨大需求。在这样的背景下,NAS便应运而生。我作为一名使用苹果Mac电脑的内容工作者,Mac电脑存储太小的…

java有 号_JAVA揭竿而起总要有名号

古代揭竿而起总要有个响亮的名号,这可不是随便的哦,比如 苍天已死,黄天当立。。。玩JAVA里面形形色色的名字,都是有套路的,至于名字怎么起法,那得问问标识符标识符用作给变量、类和方法命名。注意&#xf…

java整合html_springBoot整合mybatis、jsp 或 HTML

springBoot整合mybatis、jspSpring Boot的主要优点:1: 为所有Spring开发者更快的入门;2:开箱即用,提供各种默认配置来简化项目配置;3: 内嵌式容器简化Web项目;4: 没有…

python语言及其应用电子版翁正秋_Python语言及其应用pdf

《Python语言及其应用》内容易于理解,而且读起来生动有趣,是编程和Python初学者不可多得的教程。书中首先介绍了Python的基础知识,然后逐渐深入多种主题,结合教程和攻略式风格来讲解Python 3中的概念。每章结尾的练习可以帮助你巩…

回溯法基本思想_LeetCode--回溯法心得

这两天在刷LeetCode37题解数独时,被这个回溯法折腾的不要不要的,于是我疼定思疼发誓一定要找个能解决这类回溯法的套路出来,方便以后快速解决此类题目。于是我在网上找了两个很经典的回溯法题目--八皇后问题和迷宫问题,认真总结了…

汇编语言 把最大值放入max 把最小值放入min_Excel求最大值地球人都知道,那要求出第2、第3、第N大值呢?...

只要稍稍懂点excel的人,都会轻松地求出最大值、最小值。那要求出第2大值、第3大值……第N大值呢?往下看,掌握了方法,排序又变得很简单了。最大最小值最大值:max(B:B),最小值:min(B:B)其中B:B为最…

python3 for_python3 for循环-range遍历

for循环、range遍历 for循环range遍历 range(1,10) 注:是1-9,而不包括最后的10。实例: 九九乘法表: # -*- coding: UTF-8 -*- # 乘法表 for i in range(1,10): for j in range(1,10): print(‘{}*{}{}‘.fo…

php撒意思,php表示是什么意思

php表示超文本预处理器,它是一种通用的开源脚本语言。php是常用的网站编程语言,有着开源性、免费性、快捷性、数据库连接的广泛性、面向过程和面向对象并用等特点。php介绍:PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是…

python暂停和恢复_python-线程的暂停, 恢复, 退出

我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. 不过, 我们可以自己实现这些. 一般的方法就是循环地判断一个标志…

织梦直接写php标签,怎么在自己的php页面中使用dedecms标签

怎么在自己的php页面中使用dedecms标签?这篇文章主要介绍了在自己的php页面中使用dedecms标签的代码示例,需要的朋友可以参考下推荐学习:织梦cms第一步:外部php页面中加入如下代码:require_once (dirname(__FILE__)./../include/c…

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

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