无标题文章

1、put()操作没有加锁。

* 1个线程时每次都会找到不同的unused entries并写入,不会miss

* 当2个线程都运行到put() line61并找到同一个unused entry时,先写入的key就Miss了。

***

2、

- 修改:为put()函数加锁。第59行进入for循环前lock(), 两处return前unlock()

- 原因:这样保证同时只有1个线程可以执行put()操作

```cpp

  assert(pthread_mutex_lock(&lock) == 0);

  for (i = 0; i < NENTRY; i++) { 

    if (!table[b][i].inuse) {

      table[b][i].key = key;

      table[b][i].value = value;

      table[b][i].inuse = 1;

      assert(pthread_mutex_unlock(&lock) == 0);

      return;

    }

  }

  assert(pthread_mutex_unlock(&lock) == 0);

  ```

***

3、put的时长:

- 单线程 =  1.667020

- 双线程 =  2.083564

***

4、因为每次lock和unlock消耗时间,会有一个线程等待另一个线程释放锁。

***

5、因为双线程可以同时进行get()操作且不用在拿锁放锁上消耗时间。

***

6、

***

7、

***

Question 6: Why does valgrind report no errors for get()? Can you imagine a execution sequence where valgrind may also report error for get(), with current get() and put() functions?

Challenge

Question 7: Can you think of a way of modifying ph.c so that you get speedup for both phases and valgrind won't report race conditions? (If you have time, implement that plan and check.)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,767评论 0 9
  • ``` /* * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject ...
    非专业码农阅读 344评论 0 0
  • JAVA面试题 1、作用域public,private,protected,以及不写时的区别答:区别如下:作用域 ...
    JA尐白阅读 1,182评论 1 0
  • 1.你如何理解气沉丹田? 坐好、腰直、肩松、头定,口鼻同时进气,两肋张开气自来,把肋骨横着撑开,气息自然流动到胸腔...
    世勉阅读 550评论 0 0
  • 2018-04-18 (稻盛哲学学习会)打卡第44天 姓名:占晓敏 部门:分水碶 组别:利他二组 【知~学习】 诵...
    占晓敏阅读 184评论 0 0