thread互斥测试
thread互斥测试
实践代码
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h> //linux 线程库
#include <ctype.h> //测试和映射字符的库
struct arg_set {
char *fname;
int count;
};//定义结构体
struct arg_set *mailbox = NULL;//定义结构体指针;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;//linux线程创建锁,初始化锁
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结构体指向第二个变量
args1.count = 0;//args1结构体初始化count
pthread_create(&t1, NULL, count_words, (void *) &args1);//在执行中创建一个线程, 为该线程分配它需要做的工作(线程执行函数), 该线程共享进程的资源
args2.fname = argv[2];//args2结构体指向第三个变量
args2.count = 0;//args2结构体count初始化
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;//加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);
//解除锁定mutex所指向的互斥锁的函数
printf("%7d: total words\n", total_words);
}
void *count_words(void *a)
{
struct arg_set *args = a;
//初始化结构体,指向传参a;
FILE *fp;
int c, prevc = '\0';
if ( (fp = fopen(args->fname, "r")) != NULL ){
//成功打开文件
while( ( c = getc(fp)) != EOF ){
if ( !isalnum(c) && isalnum(prevc) )
//isalnum检测字符串是否由字母和数字组成。
args->count++;
//指向的数值count增加1
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;
}
实践截图

原理理解
- 在线程控制中首要任务是何以分配资源互斥锁的运用可以合理的避免资源过度浪费的为题。
互斥锁使用过程步骤 - 1.锁的创建 函数原型
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr) - 2.初始化锁的属性 函数原型
pthread_mutexattr_init(pthread_mutexattr_t *mattr) - 3.释放锁资源 函数原型
pthread_mutex_destory - 4.进行锁操作 函数原型
int pthread_mutex_lock(pthread_mutex_t *mutex)
int pthread_mutex_unlock(pthread_mutex_t *mutex)
int pthread_mutex_trylock(pthread_mutex_t *mutex)
代码实现意义
使用互斥锁来查看两个文件中字符串的数量,先输入的1.txt文件先被加锁,2.txt文件需等待,文件1.txt完成之后再进行文件2.txt的统计,最后输出总统计结果。
thread互斥测试的更多相关文章
- posix thread互斥量
互斥量 互斥量(Mutex)是“mutual exclusion”的缩写.互斥量是实现线程同步,和保护同时写共享数据的主要方法.使用互斥量的典型顺序如下:1. 创建和初始一个互斥量 2. 多个线程尝试 ...
- linux thread 互斥锁
#include <stdio.h> #include <stdlib.h> #include <pthread.h> void *threadhandle(voi ...
- 读写锁ReentrantReadWriteLock:读读共享,读写互斥,写写互斥
介绍 DK1.5之后,提供了读写锁ReentrantReadWriteLock,读写锁维护了一对锁:一个读锁,一个写锁.通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升.在读多写少的情况下, ...
- 多线程:head first Thread.join()
不使用Thread.join() 测试线程 先上代码: /** * Created by Zero on 2017/8/23. */ public class TestJoin implements ...
- 【并发编程】关于Thread类的详细介绍
多线程编程基础--Thread类 Thread类是Java中实现多线程编程的基础类.本篇博客就来介绍下Thread类的常用API和常见用法. Thread类常用的方法如下: Thread.active ...
- 使用threaddump-analyzer 快速查看jvm thread 状态信息
日常开发中,我们可以需要通过thread dump 查看线程信息,比如锁,spotify 团队提供了一个web 界面,很方便 以下是简单使用,同时添加了docker 支持 添加docker 支持 cl ...
- 线程中断:Thread类中interrupt()、interrupted()和 isInterrupted()方法详解
首先看看官方说明: interrupt()方法 其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行. i ...
- 面经手册 · 第20篇《Thread 线程,状态转换、方法使用、原理分析》
作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...
- [高并发]Java高并发编程系列开山篇--线程实现
Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...
- 一个自定义线程池的小Demo
在项目中如果是web请求时候,IIS会自动分配一个线程来进行处理,如果很多个应用程序共享公用一个IIS的时候,线程分配可能会出现一个问题(当然也是我的需求造成的) 之前在做项目的时候,有一个需求,就是 ...
随机推荐
- Finance财务软件(支持多账套专题)
在2.0.0.7版本中新增了账套管理的UI控制 在2.0.0.5版本中支持多账套 客户端登录的时候可以选择登录账套 在服务端Finance.exe进程所在目录新增进程FinanceConsole.ex ...
- C++future promise
A future is an object that can retrieve a value from some provider object or function, properly sync ...
- echarts的bug
Uncaught Error: Invalide sourceFormat: unknown at assert (util.js:404:15) at mountMethods (dataProvi ...
- 洛谷P4562 [JXOI2018]游戏
题目 https://www.luogu.com.cn/problem/P4562 沉迷水题无法自拔(感觉校赛要大寄特寄qwq) 思路 可以fa现可怜的检查和员工的通风报信类似一个筛法的过程,当区间中 ...
- linux服务器项目迁移非常好用的工具scp和rsync
linux系统下一般都安装了,启用一下就可以了 (1):编辑配置文件 # sudo vi /etc/default/rsync #ubuntu # vi /etc/xinetd.d/rsync #c ...
- iOS 15 UI适配
1. UINavigationBar 在iOS 15中,UINavigationBar默认为透明.在滑动时会有模糊效果.如果想要一直就是模糊效果,可以通过改变scrollEdgeAppearance属 ...
- 046_salesforce 中 Get URL
Suppose u have the whole URL as: < https://cs14.salesforce.com/apex/myVFpage?id=906F00000008w9wIA ...
- 全文检索引擎:solr lucene
solr在lucene外边做了一层厚厚的封装,主要是为了简化二次开发,提供了一些成熟的解决方案. Lucene是全文检索是对索引中Document的各field进行匹配,可返回document,得到查 ...
- (已解决)问题:windows下,为THINKPHP配置apache虚拟主机。
1. 环境和需求 win10_x64,php7,apache24,thinkphp5. 现在,我要用apache给THINKPHP的一个项目设置一个虚拟主机,需要配置. 2. 步骤 a. 首先,找到h ...
- 微软开源 Python 自动化神器 Playwright
背景 逛博客时候突然看到 Playwright web自动化,感觉很有意思,就翻看了很多博客,简单记录一下. 简介 Playwright是一个强大的Python库,仅用一个API即可自动执行Chrom ...