年前开始做这个项目,虽然主要的功能放假前已经完成,但是老板为了体现实验室的主题——并行计算,要求把一个简单的 hash 查找功能弄成复杂的“多线程并行计算”,尽管最后的多线程实现比串行的还慢(通过使用 gprof 分析发现花在同步上的开销超过了多线程带来的并行效益,因为实际的 hash 查找不怎么耗时间)。当然这些我是无力改变的,不过有个好处就是老板虽然不懂具体技术,但是却不会瞎指挥,所以在实现上倒是挺自由的,因此可以随便尝试自己想学的东西,只要最后项目完成就行。
好了,发完牢骚之后总结一下从中学到的东西吧。
生产者-消费者问题
我觉得所有的问题基本都可以归结为生产者-消费者问题:输入是生产者,程序处理是消费者。刚开始写的是串行的代码,使用惯用的套路:
int main(void)
{
......
while ((rec = producer()))
consumer(rec);
......
}
串行程序需要由 main() 函数驱动,主要逻辑由 main() 函数搭建,这样的话如果非要把多线程嵌到这个模型中,看起来会有点奇怪:
void* producer(void)
{
/* blcok until data arrives */
return get_resource_from(resource_pool);
}
void consumer(void*
…
阅读全文…