※ 引述《Clangpp (Clang++)》之铭言:
: 最近工作上常常遇到racing的问题,有够麻烦的...
: 通常都是用mutex或是 critical section来处理
: 那如果想要让他可以发挥多核的能力
: 有哪些书或是网站专门在教C/C++的 multi-thread programming的技巧??
: 以上问题就恳请大家解答
我想你应该不是想学什么哲学家吃饭的解法,multi-thread 跟所在的OS
有很大的关系,至少 Windows 早期没有条件变量这个东西,但 pthread
1x 年前我接触时就有了。
Windows:
如果你是要设计 NT service,微软主推的是 IOCP(IO Completion Port),
也就是用 Thread-Pool + GetQueuedCompletionStatus 一系列 API。不过
你要是直接用 API 会吐血的,好在 boost 有包进去。
另一种避免使用 mutex 的方式就是用 TCP socket or named pipe 替代
内存直接读写+mutex,可以参考 zeromq。
书的话推荐侯捷这本
http://jjhou.boolan.com/jjtbooks-multithreaded-in-win32.htm
不过里面 socket 的用法过时了千万别学,个人认为如果你要找这方面的
书其实是 C# 最多。
Linux/UNIX:
unix network programming volume 1,2
Advanced Programming in the UNIX Environment
Richard Stevens 大师的书必读,他去世后还有人接力帮他更新
因为 Linux 有 signal 需要处理,所以某种程度是比 win32 还要麻烦
事实上如果你两边都有经验,你会发现微软希望你用 thread,但
Linux 上 thread 其实不是很需要,尤其有了 epoll 这个神器后
有些应用根本就 single process or pre-forking + epoll 就搞定了。
个人建议是直接看目前最多人用的那几套 open source project 原始码
远比看书收获来得大,例如 memcached 有用 pthread,nginx 有用
pre-forking + epoll,这些软件内在的 cocurrent programming
技巧是经过实战考验的,比书上过时的资讯有用太多。
个人经验:
thread 能少则少, mutex 能避免则避免, thread 一堆 + mutex 贴的跟
狗皮药膏一样的软件从没见过稳定的~