面试题目:
有5个生产者线程,5个消费者线程,有一个它们公共访问的资源,使用vector存储了这些资源, 生产者用于生产资源,消费者用于消耗资源,消费者也会从容器中进行删除动作。 当前的方案是使用一个互斥锁对vector进行保护,生产者、消费者线程在访问资源之前必须先获得锁。 但是,生产者、消费者的并发频率非常高,锁导致了效率低下,请给出提高效率的方案。
1)面试时相出来的想法:
用10个vector, 每个生产者使用固定的两个,生产线程先向其中一个vector放数据,放满后再向另一个放,然后,所有的消费者线程只从当前没有正被操作的vector中取数据。
-- 只是提出了一个思路,interviewer说可以! 想法的重要性啊。
这种方案的有点应该是使得锁的粒度更小了,有利于提高并发性。
2) 面试时相出来的想法:
为生产者和消费者划分时间片,两者轮转,以解决生产者和消费者之间的竞争。 --- 不行!被否!
3)其他想法:
更换数据结构,例如使用一个队列,生产者线程向队头放,消费者从对尾取。--- 由此,想到c++并发编程书籍中提到的无锁结构!经查阅,这是一种需要仔细学习的c++ 领域。
《C++ Concurrency in Action 2nd Edition》very good!