xixi2


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

线程池

发表于 2019-10-30 | 分类于 并发编程

什么是线程池

线程池(thread pool)是一种线程使用模式。线程过多或者频繁创建和销毁线程会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着管理器分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价,以及保证了线程的可复用性。线程池不仅能够保证内核的充分利用,还能防止过分调度。

线程池原理

预先创建预定数量的线程,将多个任务加入到任务队列。类似于生产者消费者,多个线程相当于消费者,一个任务队列充当生产者。当任务队列被塞入任务时,线程们就去竞争这些任务,但每次只有一个线程能够得到任务,该任务执行完成后,线程可以释放出来去承接下一个任务,这样保证多个任务可以并发地执行。

img

一个任务队列有n个任务,可以通过线程池的调度分配到m个线程上去并发执行。

参考文献

[1]c++11实现线程池:https://zhuanlan.zhihu.com/p/64739638

生产者消费者

发表于 2019-10-30 | 分类于 并发编程

多线程

生产者消费者问题是一个经典、多线程并发协作问题。生产者消费者问题包含两类线程,一种是生产者线程用于生产数据,另一种是消费者线程用于消费数据,为了解耦生产者和消费者的关系,通常会采用共享的数据区域。生产者生产完数据之后放到共享区域中,并不需要关心消费者的行为;而消费者只需要从共享区域中取出数据,不需要关心生产者的行为。但是,

  1. 数据区域满时,生产者不能继续生产。
  2. 数据区域为空时,消费者不能继续消费。
  3. 每次只能有一个线程操作共享数据区域。

在实现生产者消费者问题时,可以采用三种方式:

  1. 使用Object的wait/notify的消息通知机制
  2. 使用Lock的condition的await/signal的消息通知机制
  3. 使用BlockingQueue

1.wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)

2.notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。

3.wait(long timeout)让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的notify()方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。

参考文献

[1]https://www.jianshu.com/p/b16296e9ac85
[2]https://www.jianshu.com/p/e29632593057

epoll源码剖析

发表于 2019-10-29 | 分类于 网络编程

参考文献

[1]https://www.jianshu.com/p/5e00e74b8ce1
[2]https://blog.csdn.net/baiye_xing/article/details/76352935

460. LFU Cache

发表于 2019-10-29 | 分类于 leetcode

Design and implement a data structure for Least Frequently Used (LFU) cache. It should support the following operations: get and put.

阅读全文 »

gdb调试

发表于 2019-10-29 | 分类于 调试

707. Design Linked List

发表于 2019-10-29 | 分类于 leetcode

Design your implementation of the linked list. You can choose to use the singly linked list or the doubly linked list. A node in a singly linked list should have two attributes: val and next. val is the value of the current node, and next is a pointer/reference to the next node. If you want to use the doubly linked list, you will need one more attribute prev to indicate the previous node in the linked list. Assume all nodes in the linked list are 0-indexed.

阅读全文 »

模板实参推断和引用

发表于 2019-10-29 | 分类于 C++基础知识

模板分为类模板,函数模板,还有成员模板。

阅读全文 »

HTTP头部

发表于 2019-10-29 | 分类于 网络编程

HTTP请求头由哪些部分构成,它们的作用分别是什么?

阅读全文 »

重载new和delete

发表于 2019-10-28 | 分类于 C++基础知识

当应用程序对于内存分配有特殊要求时,需要重载operator new和operator delete运算符.

阅读全文 »

拓扑排序

发表于 2019-10-28 | 分类于 leetcode

拓扑排序是将有向五环图G所有的顶点排成一个线性序列,使得对图G中的任意两个顶点u,v,如果存在边u->v,那么在序列中u一定在v前面。这个序列又称为拓扑序列。

阅读全文 »
1…345…18
xixi2

xixi2

一去不复返的远方还有无法抵达的过去

175 日志
21 分类
107 标签
© 2019 xixi2
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4
访问人数 总访问量 次