1.6.1 以并發(fā)的思想指導(dǎo)設(shè)計(jì)
在設(shè)計(jì)代碼發(fā)揮多核優(yōu)勢(shì)的時(shí)候,非常重要的一點(diǎn)在于不能認(rèn)為運(yùn)行在C#應(yīng)用程序中的代碼是孤立運(yùn)行的。C#已經(jīng)支持并發(fā)代碼,因此很多代碼片段能夠同時(shí)運(yùn)行在同一個(gè)進(jìn)程中,或者以交錯(cuò)執(zhí)行的方式運(yùn)行。同樣的類方法可以在并發(fā)代碼中執(zhí)行。如果這個(gè)方法在靜態(tài)變量中保存了一個(gè)狀態(tài),之后又使用了這個(gè)已保存的狀態(tài),那么很多并發(fā)執(zhí)行可能會(huì)導(dǎo)致異常且不可預(yù)測(cè)的結(jié)果。
如前所述,多核處理器的并行程序設(shè)計(jì)使用了共享內(nèi)存的模型。數(shù)據(jù)保存在同一個(gè)共享內(nèi)存中,因此,如果設(shè)計(jì)的時(shí)候沒(méi)有考慮并發(fā)的問(wèn)題,那么就有可能造成異常結(jié)果。
在設(shè)計(jì)類和方法時(shí),最好將它們?cè)O(shè)計(jì)為能夠沒(méi)有副作用(side effect)地并發(fā)運(yùn)行。如果類、方法和組件在設(shè)計(jì)的時(shí)候沒(méi)有考慮到并發(fā),那么在并行化的代碼中使用它們的時(shí)候最好對(duì)它們的設(shè)計(jì)進(jìn)行測(cè)試。
在設(shè)計(jì)過(guò)程中找出的每一個(gè)子問(wèn)題都應(yīng)該能夠在其他子問(wèn)題并發(fā)執(zhí)行的同時(shí)執(zhí)行。如果您覺(jué)得由于某個(gè)子問(wèn)題使用了遺留的類、方法或組件,因此當(dāng)這個(gè)子問(wèn)題運(yùn)行的時(shí)候應(yīng)該限制并發(fā)代碼,那么應(yīng)該在設(shè)計(jì)文檔中將這個(gè)問(wèn)題闡述清楚。一旦開(kāi)始使用并行化代碼,很容易與其他既有的類、方法和組件進(jìn)行協(xié)作,而那些類、方法和組件很可能會(huì)產(chǎn)生不必要的副作用,因?yàn)樗鼈冊(cè)谠O(shè)計(jì)的時(shí)候并沒(méi)有考慮并發(fā)執(zhí)行。