Re: [問題] 多執行緒程式撰寫技巧

作者: godspeedlee (妳,我可以)   2016-01-30 00:23:15
※ 引述《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 貼的跟
狗皮藥膏一樣的軟體從沒見過穩定的~
作者: Clangpp (Clang++)   2016-01-30 09:39:00
QQ 我目前是比較想要用C++11的native thread因為可以跨平台 而我其實是比較想看哲學的書XD不過還是謝謝你的推薦
作者: kwpn (ITSST)   2016-01-31 12:51:00
還是推薦原po看C++ concurrency in action, C++11的thread很單純容易使用,而且跨平台不用像這篇要學這麼多東西
作者: godspeedlee (妳,我可以)   2016-02-03 00:53:00
其實很難閃避平台特性,再說能跟OS API完美結合也是也是C/C++強項

Links booklink

Contact Us: admin [ a t ] ucptt.com