杂谈:多线程编程

刚写个 thread pool。lock 用的相当痛苦,也不知道有没有 bug。好吧应该不会有 deadlock,但 race condition 就难说了。效率肯定比 boost 里的那个半官方的差远了。还好只是练习。

于是教训是,尽量别用 lock。。。

嗯,不是说不要用并行计算。这东西算是趋势了,CPU 核心数是现在和未来一段时间内计算机界的免费午餐吧,所以这个避免不了。

是说尽可能避免用现在说来算是低阶的 thread 和 lock 来处理并行计算。对于非效率关键的并行计算,不妨看下当前的框架下有没有高阶的并行实现,比如 Cocoa 的 Grand Central Dispatch,Qt 的 QtConcurrent 之类的。就算对于效率关键的并行计算,OpenMP 应该也可以基本应付了。

如果真要用 thread 和 lock,记得几件事:一,该 lock 的共享资源都要 lock(废话),尽量别同时 lock 几个 mutex(否则就要记顺序了);二,lock 中别去 call 什么虚函数或者回调函数(谁知道那些函数会做什么,就算现在没事之后哪天谁改了两行无关代码然后就 deadlock 掉也说不定);三,剩下没 lock 的好好查查,至少记得加上 volatile 关键字。

最后,有一句话用在这里最适当了,“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.”
嗯,就是说如果你发现线程相关的代码写的太复杂了,那说明基本上你是写错了(好吧,Hoare 原来指的是设计的复杂度)。

这次真的是随便写写,有错请指教。。。

Advertisements
This entry was posted in Computer and Internet, Programming and Algorithm. Bookmark the permalink.

2 Responses to 杂谈:多线程编程

  1. hang says:

    强烈要求开源

  2. Xu Weidong says:

    写太矬了,没脸开源啊。。。掩面

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s