ACE,Python和Java(我所知道的)中要獲得多線程的能力,都是通過(guò)從一個(gè)線程對(duì)象基類(lèi)繼承,重載特定的成員函數(shù)來(lái)實(shí)現(xiàn)。簡(jiǎn)單的來(lái)看,它用起 來(lái)也相當(dāng)簡(jiǎn)單,理解起來(lái)也不復(fù)雜,但,用過(guò)一段時(shí)間之后,就會(huì)發(fā)現(xiàn)處理復(fù)雜問(wèn)題時(shí),你會(huì)遇到許多的限制。
1.必須從一個(gè)線程對(duì)象基類(lèi)繼承嗎?
現(xiàn)在看來(lái)是的,否則,你只有使用系統(tǒng)OS提供的線程函數(shù)了。
2.我已經(jīng)有個(gè)類(lèi)了,它不是從線程對(duì)象基類(lèi)繼承的,我要使用多繼承嗎?
是的,除非重寫(xiě)。
3.我有一個(gè)函數(shù),想讓他在另一個(gè)線程執(zhí)行,一定要寫(xiě)個(gè)類(lèi)嗎?
是的。
4.我有一個(gè)類(lèi),它的每個(gè)成員函數(shù)我都想他們?cè)诹硗獾木€程中執(zhí)行,怎么辦?
線程對(duì)象基類(lèi)只有一個(gè)線程函數(shù),你必須通過(guò)某種通訊機(jī)制去讓它執(zhí)行不同的成員函數(shù)。
4.當(dāng)線程在執(zhí)行一個(gè)對(duì)象的某個(gè)成員時(shí),這個(gè)對(duì)象被刪除了怎么辦?
沒(méi)辦法,你必須自己管理對(duì)象的生存期。
嗚呼!問(wèn)題越來(lái)越多,該怎么辦?我們需要某種透明的線程模型,他能處理任意的需要被異步執(zhí)行的類(lèi)的成員函數(shù)或者普通函數(shù),它能提供一種策略,使得我們能 自動(dòng)管理處理不同線程中的對(duì)象的生存期。我們現(xiàn)在有了這種工具了嗎?
熟悉Boost的人可能覺(jué)得boost.thread也許提供了這種能力。很不幸,它滿足了一部分上述需求。
正在實(shí)現(xiàn)上述需求的一個(gè)線程模型。它將任務(wù)與任務(wù)的執(zhí)行者分離,它支持人任何的任務(wù),不論它是普通的函數(shù),還是具有任意參數(shù)的成員函數(shù),你均能將它作為 一個(gè)任務(wù)拋到其他的線程執(zhí)行,它是非侵入式,通過(guò)它所支持的生命期管理,你不用在擔(dān)心對(duì)象在異步執(zhí)行時(shí)被銷(xiāo)毀。它用模板實(shí)現(xiàn)。