CS162 操作系统HW2(使用Liunx内核链表以及多线程实现WordCounter)

2023-11-12

心得体会

IDE自动提示补全真的特别重要,大大提高开发效率。通过IDE自动搜索库函数API。

GDB调试能力要加强。

 

使用前面提供的list.h来改写wordCount程序,头文件的实现相当有技巧,将使用外部list库,多线程都用宏定义到同一份代码中,这是C/C++开发的常用技巧。

这里Linux内核里面的链表实现和传统的有一些区别

word_count.h

#ifdef PINTOS_LIST
#include "list.h"
typedef struct word_count {
  char* word;
  int count;
  struct list_elem elem;
} word_count_t;

#ifdef PTHREADS
#include <pthread.h>
typedef struct word_count_list {
  struct list lst;
  pthread_mutex_t lock;
} word_count_list_t;
#else  /* PTHREADS */
typedef struct list word_count_list_t;
#endif /* PTHREADS */

#else  /* PINTOS_LIST */

typedef struct word_count {
  char* word;
  int count;
  struct word_count* next;
} word_count_t;

typedef word_count_t* word_count_list_t;
#endif /* PINTOS_LIST */

/* Initialize a word count list. */
void init_words(word_count_list_t* wclist);

/* Get length of a word count list. */
size_t len_words(word_count_list_t* wclist);

/* Find a word in a word_count list. */
word_count_t* find_word(word_count_list_t* wclist, char* word);

/*
 * Insert word with count=1, if not already present; increment count if
 * present. Takes ownership of word.
 */
word_count_t* add_word(word_count_list_t* wclist, char* word);

/* Print word counts to a file. */
void fprint_words(word_count_list_t* wclist, FILE* outfile);

/* Sort a word count list using the provided comparator function. */
void wordcount_sort(word_count_list_t* wclist, bool less(const word_count_t*, const word_count_t*));

#endif /* WORD_COUNT_H */

word_count_l.c  单线程的实现

#ifndef PINTOS_LIST
#error "PINTOS_LIST must be #define'd when compiling word_count_l.c"
#endif

#include "word_count.h"

void init_words(word_count_list_t* wclist) {
  list_init(wclist);
  return;
}

size_t len_words(word_count_list_t* wclist) {
  return list_size(wclist);
}

word_count_t* find_word(word_count_list_t* wclist, char* word) {
  struct list_elem *e;
  for(e=list_begin(wclist);e!=list_end(wclist);e=list_next(e)){
    word_count_t* p = list_entry(e,word_count_t, elem);
    if(strcmp(p->word,word)==0){
      return p;
    }
  }
  return NULL;
}

word_count_t* add_word(word_count_list_t* wclist, char* word) {
  word_count_t* p = find_word(wclist,word);
  if(p!=NULL){
    p->count++;
    return p;
  }
  word_count_t* tmp = (word_count_t*)malloc(sizeof(word_count_t));
  tmp->count = 1;
  tmp->word = word; 
  list_push_back(wclist,&tmp->elem);
  return tmp;
}

void fprint_words(word_count_list_t* wclist, FILE* outfile) {
  struct list_elem *e;
  for (e = list_begin (wclist); e != list_end(wclist);e = list_next (e)){
    word_count_t *wc = list_entry(e, word_count_t, elem);
    fprintf(outfile, "%8d\t%s\n", wc->count, wc->word);
  }
}

static bool less_list(const struct list_elem* ewc1, const struct list_elem* ewc2, void* aux) {
  /* TODO */
  bool (*less)(const word_count_t *, const word_count_t *) = aux;
  word_count_t *wc1 = list_entry(ewc1, word_count_t, elem);
  word_count_t *wc2 = list_entry(ewc2, word_count_t, elem);
  return less(wc1, wc2);
}

void wordcount_sort(word_count_list_t* wclist,
                    bool less(const word_count_t*, const word_count_t*)) {
  list_sort(wclist, less_list, less);
}

多线程的实现很简单,在插入时保证线程完全,加锁即可。注意结构体的定义发生改变。

#ifndef PINTOS_LIST
#error "PINTOS_LIST must be #define'd when compiling word_count_lp.c"
#endif

#ifndef PTHREADS
#error "PTHREADS must be #define'd when compiling word_count_lp.c"
#endif

#include "word_count.h"

void init_words(word_count_list_t* wclist) {
  list_init(&wclist->lst);
  pthread_mutex_init(&wclist->lock, NULL);
}

size_t len_words(word_count_list_t* wclist) {
  return list_size(&wclist->lst);
}

word_count_t* find_word(word_count_list_t* wclist, char* word) {
  struct list_elem *e;
  for(e=list_begin(&wclist->lst);e!=list_end(&wclist->lst);e=list_next(e)){
    word_count_t* p = list_entry(e,word_count_t, elem);
    if(strcmp(p->word,word)==0){
      return p;
    }
  }
  return NULL;
}

word_count_t* add_word(word_count_list_t* wclist, char* word) {
  pthread_mutex_lock(&wclist->lock);
  word_count_t* p = find_word(wclist,word);
  if(p!=NULL){
    p->count++;
  }else{
    p = (word_count_t*)malloc(sizeof(word_count_t));
    p->count = 1;
    p->word = word;
    list_push_front(&wclist->lst,&p->elem);
  }
  pthread_mutex_unlock(&wclist->lock);
  return p;
}

void fprint_words(word_count_list_t* wclist, FILE* outfile) { /* TODO */
  struct list_elem *e;
  for (e = list_begin(&wclist->lst);e!=list_end(&wclist->lst);e=list_next(e)){
    word_count_t *wc = list_entry(e, word_count_t, elem);
    fprintf(outfile, "%8d\t%s\n", wc->count, wc->word);
  }
}

static bool less_list(const struct list_elem* ewc1, const struct list_elem* ewc2, void* aux) {
  /* TODO */
  bool (*less)(const word_count_t *, const word_count_t *) = aux;
  word_count_t *wc1 = list_entry(ewc1, word_count_t, elem);
  word_count_t *wc2 = list_entry(ewc2, word_count_t, elem);
  return less(wc1, wc2);
}

void wordcount_sort(word_count_list_t* wclist,
                    bool less(const word_count_t*, const word_count_t*)) {
  list_sort(&wclist->lst, less_list, less);
}

在来看一遍主函数

typedef struct thread_word_args
{
  word_count_list_t* word_counts;
  char* filename;
} targs_t;

void *threadfun(void *arg) {
  targs_t* targs = (targs_t*)arg;
  FILE *infile = fopen(targs->filename, "r");
  if (infile == NULL) {
    perror("fopen");
    pthread_exit(NULL);
  }
  // pthread_mutex_lock(&targs->word_counts->lock);
  count_words(targs->word_counts, infile);
  // pthread_mutex_unlock(&targs->word_counts->lock);
  fclose(infile);
  pthread_exit(NULL);
}

/*
 * main - handle command line, spawning one thread per file.
 */
int main(int argc, char* argv[]) {
  /* Create the empty data structure. */
  word_count_list_t word_counts;
  init_words(&word_counts);

  if (argc <= 1) {
    /* Process stdin in a single thread. */
    count_words(&word_counts, stdin);
  } else {
    int nthreads = argc - 1;
    pthread_t threads[nthreads];
    for(int i=0;i<nthreads;i++){
      targs_t* targs = (targs_t *) malloc(sizeof(targs_t));
      targs->filename = argv[i+1];
      targs->word_counts = &word_counts;
      int rc = pthread_create(&threads[i], NULL, threadfun, (void *)targs);
      if(rc){
        printf("ERROR; return code from pthread_create() is %d\n", rc);
        exit(-1);
      }
    }
    for(int i=0;i<nthreads;i++){
      pthread_join(threads[i],NULL);
    }
  }

  /* Output final result of all threads' work. */
  wordcount_sort(&word_counts, less_count);
  fprint_words(&word_counts, stdout);
  pthread_exit(NULL);
  return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CS162 操作系统HW2(使用Liunx内核链表以及多线程实现WordCounter) 的相关文章

  • 图文并茂:推荐算法架构——粗排

    导语 粗排是介于召回和精排之间的一个模块 是典型的精度与性能之间trade off的产物 理解粗排各技术细节 一定要时刻把精度和性能放在心中 本篇将深入重排这个模块进行阐述 一 总体架构 粗排是介于召回和精排之间的一个模块 它从召回获取上万
  • bilibili粉丝显示器

    代码地址 https github com hungtcs lab bilibili follower viewer ArduinoJSON https arduinojson org esp8266 oled ssd1306 https
  • Spirng @Conditional 条件注解的使用

    1 简介 Conditional 是 Spring 4 0 提出的一个新的注解 当标注的对象满足所有的条件时 才能注册为 Spring 中的 bean Conditional 源码中的定义如下 Target ElementType TYPE
  • C# Datagridview 标题完全居中

    DataGridView标题完全居中 标题文字居中 this dataGridView1 ColumnHeadersDefaultCellStyle Alignment DataGridViewContentAlignment Middle

随机推荐

  • Java 语言 TreeMap

    Java中的TreeMap是一种基于红黑树实现的排序映射表 它可以存储键值对 其中键和值都可以是任意类型的对象 TreeMap提供了快速的插入 删除和查找操作 具有高效的性能 并且可以根据键进行排序 因此在Java编程中非常常见 本文将介绍
  • 博士申请

    合适的工作难找 最新的招聘信息也不知道 AI 求职为大家精选人工智能领域最新鲜的招聘信息 助你先人一步投递 快人一步入职 南洋理工大学 南洋理工大学 Nanyang Technological University 是新加坡的一所世界著名研
  • 解决 Python 库安装提示:ModuleNotFoundError: No module named ‘windows‘. 问题解决方法

    在安装pyMouse PyKeyboard的时候报错我们可以尝试以下代码 应该有用 pip install PyUserInput
  • unity对象池系统

    当游戏场景中出现大量的可重复利用的物体时 通过Destory来销毁再创建会触发不必要的GC回收机制 浪费性能 我们可以利用unity自带的对象池系统 从而节约性能来得到同样的效果 为了使用这个对象池系统 我写了一个瞬间产生多枚子弹的测试脚本
  • 权限认证。。

    链接 手摸手 带你用vue撸后台 系列二 登录权限篇 掘金 juejin cn 前端权限控制 一 前端权限管理及动态路由配置方案 ONEO阿喔哟的博客 CSDN博客 检查员工是否具有特权 param requestTokenBO 请求令牌B
  • 如何快速算出一个数有多少个因子(c++)

    如何快速算出一个数有多少个 多少种 因子 c int count int n int sum 1 for int i 2 i i lt n i if n i 0 int tmp 0 while n i 0 n i tmp sum sum t
  • Piecewise混沌映射/PWLCM混沌映射(含MATLAB代码)

    一 Piecewise混沌映射 PWLCM混沌映射 混沌映射是生成混沌序列的一种方法 常见的混沌映射方式有 Logistic映射 Tent映射 Circle映射 而 Piecewise映射作为混沌映射的典型代表 数学形式简单 具有遍历性和随
  • python文件操作(with open)——读取行、写操作

    一 基础语法 1 打开文件 这里只介绍一种常用方式 但是打开文件方式有很多种 掌握一种最适合自己的即可 推荐使用这种方式 因为不需要close 具体原因往下看 看到示例就懂了 打开文件的模式有很多种 r 读 w 写等 此处不做详细介绍 采用
  • sublime text3取消自动换行!

    菜单栏中取消view gt word wrap的勾选也可以取消其代码的自动换行 菜单栏选择preferences gt Setting User中添加 word wrap false 即可
  • 膜拜(离散化差分模板题)

    题目描述 小鱼有 n 名优秀的粉丝 粉丝们得知小鱼将会在一条直线上出现 打算去膜他 为了方便 粉丝们在这条直线上建立数轴 第 i 名粉丝有一个侦查区间 li ri 如果小鱼在 j li j ri 处出现 这名粉丝将立刻发现并膜他 小鱼希望膜
  • python 3 中文URL编码转换问题

    链接里面含中文 转成URL编码 先引入模块 from urllib request import quote gt gt gt ff 摄像头 gt gt gt ff quote ff gt gt gt ff E6 91 84 E5 83 8
  • sql 还原数据库 错误3154

    在SQL Server2005及以下版本做数据库备份还原时 需要首先建立数据库 然后才能进行数据库还原操作 而在SQL Server2005以上版本做数据库还原时 不需要建立数据库 可以直接进行数据库还原操作 否则执行数据库还原操作时会报3
  • 求阶乘之和(循环版)(利用阶乘函数)

    请编写函数 用循环方法求阶乘之和 SumFac n 0 1 2 3 n include
  • uniapp uview 登录页

  • DETRs Beat YOLOs on Real-time Object Detection论文详解

    论文题目 DETRs Beat YOLOs on Real time Object Detection 论文地址 https arxiv org abs 2304 08069 论文代码 mirrors facebookresearch Co
  • jmeter:linux环境运行jmeter并生成报告

    是一个java开发的利用多线程原理来模拟并发进行性能测试的工具 一般来说 GUI模式只用于创建脚本以及用来debug 执行测试时建议使用非GUI模式运行 这篇博客 介绍下在linux环境利用jmeter进行性能测试的方法 以及如何生成测试报
  • matplotlib绘图与可视化2

    文章目录 前言 一 使用pandas和seaborn绘图 1 1 折线图 1 2 柱状图 1 3 直方图和密度图 1 4 散点图或点图 1 5 分面网格和分类数据 总结 前言 matplotlib是一个相当底层的工具 你可以从其基本组件中组
  • java ioc依赖注入,Spring bean的实例化和IOC依赖注入详解

    前言 我们知道 IOC是Spring的核心 它来负责控制对象的生命周期和对象间的关系 举个例子 我们如何来找对象的呢 常见的情况是 在路上要到处去看哪个MM既漂亮身材又好 符合我们的口味 就打听她们的电话号码 制造关联想办法认识她们 然后
  • 【带头结点的单链表】

    带头结点的单链表 前言 一 带头结点的单链表结构体设计 1 带头结点的单链表 2 结构体声明 二 函数实现 1 初始化 2 申请新节点 3 头插 4 尾插 5 按位置插入 6 头删 7 尾删 8 销毁 总结 前言 单链表的概念 单链表是一种
  • CS162 操作系统HW2(使用Liunx内核链表以及多线程实现WordCounter)

    心得体会 IDE自动提示补全真的特别重要 大大提高开发效率 通过IDE自动搜索库函数API GDB调试能力要加强 使用前面提供的list h来改写wordCount程序 头文件的实现相当有技巧 将使用外部list库 多线程都用宏定义到同一份