首页 > 其他分享 >thread互斥测试

thread互斥测试

时间:2022-11-08 21:12:33浏览次数:46  
标签:thread lock printf mailbox 互斥 线程 测试 pthread

编译运行附件中的代码,并说明程序的功能
根据自己的理解,提交不少于3张图片

一、代码

#include  <stdio.h>
#include  <stdlib.h>
#include  <pthread.h>
#include  <ctype.h>

struct arg_set {
		char *fname;
		int  count;
};

struct arg_set  *mailbox = NULL;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t  flag = PTHREAD_COND_INITIALIZER;

void *count_words(void *);
int main(int argc, char *argv[])
{
	pthread_t t1, t2;
	struct arg_set args1, args2;
	int reports_in = 0;
	int	total_words = 0;

	if ( argc != 3 ){
		printf("usage: %s file1 file2\n", argv[0]);
		exit(1);
	}

	args1.fname = argv[1];
	args1.count = 0;
	pthread_create(&t1, NULL, count_words, (void *) &args1);

	args2.fname = argv[2];
	args2.count = 0;
	pthread_create(&t2, NULL, count_words, (void *) &args2);

	pthread_mutex_lock(&lock);
	while( reports_in < 2 ){
		printf("MAIN: waiting for flag to go up\n");
		pthread_cond_wait(&flag, &lock); 
		printf("MAIN: Wow! flag was raised, I have the lock\n");
		printf("%7d: %s\n", mailbox->count, mailbox->fname);
		total_words += mailbox->count;
		if ( mailbox == &args1) 
			pthread_join(t1,NULL);
		if ( mailbox == &args2) 
			pthread_join(t2,NULL);
		mailbox = NULL;
		pthread_cond_signal(&flag);	
		reports_in++;
	}
	pthread_mutex_unlock(&lock);

	printf("%7d: total words\n", total_words);
}
void *count_words(void *a)
{
	struct arg_set *args = a;
	FILE *fp;
	int  c, prevc = '\0';

	if ( (fp = fopen(args->fname, "r")) != NULL ){
		while( ( c = getc(fp)) != EOF ){
			if ( !isalnum(c) && isalnum(prevc) )
				args->count++;
			prevc = c;
		}
		fclose(fp);
	} else
		perror(args->fname);
	printf("COUNT: waiting to get lock\n");
	pthread_mutex_lock(&lock);
	printf("COUNT: have lock, storing data\n");
	if ( mailbox != NULL ){
		printf("COUNT: oops..mailbox not empty. wait for signal\n");
		pthread_cond_wait(&flag,&lock);
	}
	mailbox = args;
	printf("COUNT: raising flag\n");
	pthread_cond_signal(&flag);
	printf("COUNT: unlocking box\n");
	pthread_mutex_unlock(&lock);
	return NULL;
}

image

二、编译

image

三、运行

image

四、说明

  • 通过thread互斥来查看两个文件中字符串的数量,一个空格分开算两个,第一个1.txt文件先获得锁,第二个2.txt文件则需要等待,当第一个完成之后再进行第二个文件的统计操作,最后输出总结果。
  • 互斥锁,是一种信号量,常用来防止两个进程或线程在同一时刻访问相同的共享资源。可以保证以下三点:
  1. 原子性:把一个互斥量锁定为一个原子操作,这意味着操作系统(或pthread函数库)保证了如果一个线程锁定了一个互斥量,没有其他线程在同一时间可以成功锁定这个互斥量。
  2. 唯一性:如果一个线程锁定了一个互斥量,在它解除锁定之前,没有其他线程可以锁定这个互斥量。
  3. 非繁忙等待:如果一个线程已经锁定了一个互斥量,第二个线程又试图去锁定这个互斥量,则第二个线程将被挂起(不占用任何cpu资源),直到第一个线程解除对这个互斥量的锁定为止,第二个线程则被唤醒并继续执行,同时锁定这个互斥量。
    从以上三点,我们看出可以用互斥量来保证对变量(关键的代码段)的排他性访问。

标签:thread,lock,printf,mailbox,互斥,线程,测试,pthread
From: https://www.cnblogs.com/20201212ycy/p/16871220.html

相关文章

  • 数据测试总结
    问题:mysql 语法转hql语法过程遇到的问题:int类型和字符串类型比较大小,比如表中是int类型 10< '1'  或者  '10'>1 ,常见与where 后写法类......
  • 如何进行适配测试呢?
    1.手机常见分辨率选择:常见的分辨率:720X1280\1080X1920\800X12802.同一分辨率有多台手机,那就选择系统较低的3.手机适配系统:安卓:Android11,Android12,对用户使用......
  • 使用Rancher搭建K8S测试环境
    环境准备(4台主机,Ubuntu16.04+Docker1.12.6+SSH):rancher1192.168.3.160只做管理节点node1192.168.3.161K8S的节点1node2192.168.3.162K8S的节点2no......
  • 一文读懂 PyTorch 版本 SRGAN训练和测试【CVPR 2017】
    ????声明:作为全网AI领域干货最多的博主之一,❤️不负光阴不负卿❤️????深度学习:#超分重建、一文读懂????超分重建经典网络SRGAN详尽教程????最近更新:2022年2月28......
  • 我只是用这20个JavaScript的代码题来测试我的朋友同事,结果我被他们殴打了一顿
    英文|https://medium.com/frontend-canteen/20-useless-but-funny-challange-for-javascript-developer-9eea39bb8efb翻译| 杨小爱由于JavaScript是一种容错率极高的编......
  • 接口测试测什么?
     功能测试逻辑测试异常测试用例:1.参数异常:关键字异常、参数值为空、多参数、少参数、错误参数(参数名称不正确)2.数据异常:数据长度不一致(银行系统必......
  • 快来测试下你的输入法正不正经 - 一个@引发的血案正在上映~
    事情是这样式儿滴~~~~在IM工具、Wiki文档中我们经常使用​​@​​​符号来做提及人、提及文档的功能,最近胡哥就是在做这个业务需求的时候被​​@​​这个符号坑惨了。PM想要......
  • 【前端面试题】—19道有关前端测试的面试题(附答案)
    虽然工作中有专门的测试人员(QA工程师)帮我们实现对代码的测试,但是为保证开发的代码质量,我们还是要进行单测、自测。测试部分的面试题主要考察应试者对前端测试的了解,主要涉及......
  • 接口测试思路
    测试流程需求规格说明书--接口文档--接口分析--接口用例设计--接口用例评审--接口测试执行(关注数据库)--前后端对接系统界面测试--测试结束 如何设计接口测试用例?1.接......
  • 什么是渗透测试?渗透测试培训班如何选择?
    渗透测试是网络安全体系中细分的就业方向之一,该岗位对实操经验、技术水平要求较高,必须通过专业的培训才可以满足企业用人需求。因此为了快速成为一名专业的渗透测试工程......