เดเดเตเดเดญเดเตเดทเดฃ เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเตเดเต เดชเตเดฐเดถเตเดจเดคเตเดคเดฟเตปเตเดฑเต เดเดฆเดพเดนเดฐเดฃเด เดเดชเดฏเตเดเดฟเดเตเดเต .เดจเตเดฑเตเดฑเดฟเตฝ เดธเดฎเดพเดจเตเดคเดฐเดตเตเด เดธเดฎเดพเดจเตเดคเดฐเดตเตเดฎเดพเดฏ เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดเดเต เดเดเตเดเดจเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเตเดตเตเดจเตเดจเต เดจเตเดเตเดเดพเด. เดคเตเดฐเตเดกเต/เดชเตเดฐเตเดธเดธเต เดธเดฟเตปเดเตเดฐเตเดฃเตเดธเตเดทเตป เดฎเตเดคเตฝ เดเดเตเดเตผ เดฎเตเดกเตฝ เดตเดฐเต (เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดญเดพเดเดเตเดเดณเดฟเตฝ) เดชเตเดฒเดพเตป เดเดชเตเดฐเดเดพเดฐเดฎเดพเดฃเต. เดเดฆเตเดฏ เดชเดฐเดฟเดเดฏเดเตเดเดพเดฐเดจเต เดจเดฟเดเตเดเดณเตเดเต เด เดฑเดฟเดตเต เดชเตเดคเตเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดฒเตเดเดจเด เดเดชเดฏเตเดเดชเตเดฐเดฆเดฎเดพเดเตเด.
เดเดจเตเดคเตเดเตเดฃเตเดเดพเดฃเต เดเดคเต เดเดเตเดเดจเต เดเตเดฏเตเดฏเดฃเดฎเตเดจเตเดจเต เดชเตเดฒเตเด เด เดฑเดฟเดฏเตเดจเตเดจเดคเต? เดเตเดฐเดพเตปเดธเดฟเดธเตเดฑเตเดฑเดฑเตเดเตพ เด เดตเดฏเตเดเต เดเดฑเตเดฑเดตเตเด เดเตเดฑเดเตเด เดตเดฒเตเดชเตเดชเดคเตเดคเดฟเตฝ เดเดคเตเดคเตเดจเตเดจเต, เดฎเตเดฑเดฟเตปเตเดฑเต เดจเดฟเดฏเดฎเด เดชเตเดฐเดเดพเดถเดคเตเดคเดฟเตปเตเดฑเต เดตเตเดเดคเดฏเตเดเต เดชเดฐเดฟเดงเดฟเดฏเดฟเตฝ เดเดคเตเดคเตเดจเตเดจเต, เด เดคเดฟเดจเดพเตฝ เดธเดเดเตเดฏเดเดณเดฟเตฝ เดตเดณเตผเดเตเด เดจเดฟเดฐเตเดเตเดทเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจเต. เด เดคเต เดธเดฎเดฏเด, เดกเดพเดฑเตเดฑเดฏเตเดเต เด เดณเดตเต เดตเดณเดฐเตเดเดฏเดพเดฃเต, เดเตเดเดพเดคเต เดเดชเดฏเตเดเตเดคเดพเดเตเดเตพ เดธเดฟเดธเตเดฑเตเดฑเดเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดเดจเดเดฟ เดชเตเดฐเดคเดฟเดเดฐเดฃเด เดชเตเดฐเดคเตเดเตเดทเดฟเดเตเดเตเดจเตเดจเต. เด เดคเตเดคเดฐเดฎเตเดฐเต เดธเดพเดนเดเดฐเตเดฏเดคเตเดคเดฟเตฝ, "เดธเดพเดงเดพเดฐเดฃ" เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดเดเต, เดจเดฎเตเดเตเดเต เดเดฐเต เดเดเตเดธเดฟเดเตเดฏเตเดเตเดเดฟเดเดเต เดคเตเดฐเตเดกเต เดเดณเตเดณเดชเตเดชเตเตพ, เด เดคเต เดซเดฒเดชเตเดฐเดฆเดฎเดฒเตเดฒ. เดเดฐเตเดธเดฎเดฏเด เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดฐเตเดธเดฎเดฏเด เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจ เดชเตเดฐเดถเตเดจเด เดเดเตเดเดจเตเดฏเตเดเตเดเดฟเดฒเตเด เดชเดฐเดฟเดนเดฐเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต. เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เด เดชเตเดฐเดถเตเดจเด เดตเดฟเดตเดฟเดง เดคเดฒเดเตเดเดณเดฟเตฝ เดจเดฟเดฒเดตเดฟเดฒเตเดฃเตเดเต: เดคเตเดฐเตเดกเต เดคเดฒเดคเตเดคเดฟเตฝ, เดชเตเดฐเตเดธเดธเตเดธเต เดคเดฒเดคเตเดคเดฟเตฝ, เดจเตเดฑเตเดฑเตเดตเตผเดเตเดเดฟเดฒเต เดฎเตเดทเตเดจเตเดเดณเตเดเต เดคเดฒเดคเตเดคเดฟเตฝ (เดตเดฟเดคเดฐเดฃ เดธเดเดตเดฟเดงเดพเดจเดเตเดเตพ). เดเดคเตเดคเดฐเด เดชเตเดฐเดถเตโเดจเดเตเดเตพ เดตเตเดเดคเตเดคเดฟเดฒเตเด เดเดพเดฐเตเดฏเดเตเดทเดฎเดฎเดพเดฏเตเด เดชเดฐเดฟเดนเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต .NET-เดจเต เดเดฏเตผเดจเตเดจ เดจเดฟเดฒเดตเดพเดฐเดฎเตเดณเตเดณเดคเตเด เดธเดฎเดฏเด เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเดคเตเดฎเดพเดฏ เดธเดพเดเตเดเตเดคเดฟเดเดตเดฟเดฆเตเดฏเดเดณเตเดฃเตเดเต.
เดฒเดเตเดทเตเดฏเด
Edsger Dijkstra 1965-เตฝ เดคเตปเตเดฑเต เดตเดฟเดฆเตเดฏเดพเตผเดคเตเดฅเดฟเดเดณเตเดเต เด เดชเตเดฐเดถเตเดจเด เดเตเดฆเดฟเดเตเดเต. เดธเตเดฅเดพเดชเดฟเดคเดฎเดพเดฏ เดฐเตเดชเตเดเดฐเดฃเด เดเดชเตเดฐเดเดพเดฐเดฎเดพเดฃเต. เดเดฐเต เดจเดฟเดถเตเดเดฟเดค (เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เด เดเตเดเต) เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเตเด เด เดคเต เดเดฃเตเดฃเด เดซเตเตผเดเตเดเตเดเดณเตเด เดเดฃเตเดเต. เด เดตเตผ เดเดฐเต เดฑเตเดฃเตเดเต เดเตเดฌเดฟเดณเดฟเตฝ เดเดฐเดฟเดเตเดเตเดจเตเดจเต, เด เดตเดฏเตเดเตเดเดฟเดเดฏเดฟเตฝ เดซเตเตผเดเตเดเตเดเตพ. เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตผเดเตเดเต เด เดจเดจเตเดคเดฎเดพเดฏ เดญเดเตเดทเดฃเดคเตเดคเดฟเตปเตเดฑเต เดชเตเดฒเตเดฑเตเดฑเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดดเดฟเดเตเดเดพเด, เดเดฟเดจเตเดคเดฟเดเตเดเดพเด เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเดพเด. เดญเดเตเดทเดฃเด เดเดดเดฟเดเตเดเดพเตป, เดเดฐเต เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตป เดฐเดฃเตเดเต เดซเตเตผเดเตเดเตเดเตพ เดเดเตเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต (เดฐเดฃเตเดเดพเดฎเดคเตเดคเตเดคเต เดฎเตเดฎเตเดชเดคเตเดคเตเดคเดฟเดจเตเดชเตเดชเด เดเดฐเต เดซเตเตผเดเตเดเต เดชเดเตเดเดฟเดเตเดจเตเดจเต). เดเดฐเต เดซเตเตผเดเตเดเต เดเดเตเดเตเดเตเดจเตเดจเดคเตเด เดคเดพเดดเตเดฏเดฟเดเตเดจเตเดจเดคเตเด เดฐเดฃเตเดเต เดตเตเดฏเดคเตเดฏเดธเตเดค เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดเดณเดพเดฃเต. เดเดฒเตเดฒเดพ เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเตเด เดจเดฟเดถเดฌเตเดฆเดฐเดพเดฃเต. 54 เดตเตผเดทเดคเตเดคเดฟเดจเต เดถเตเดทเดตเตเด เด เดตเดฐเตเดฒเตเดฒเดพเด เดเดฟเดจเตเดคเดฟเดเตเดเตเดเดฏเตเด เดจเดจเตเดจเดพเดฏเดฟ เดญเดเตเดทเดฃเด เดจเตฝเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจ เดคเดฐเดคเตเดคเดฟเตฝ เด เดคเตเดคเดฐเดฎเตเดฐเต เด เตฝเดเตเดฐเดฟเดคเด เดเดฃเตเดเตเดคเตเดคเตเด เดเดจเตเดจเดคเดพเดฃเต เดเตเดฎเดคเดฒ.
เดเดฆเตเดฏเด, เดชเดเตเดเดฟเดเตเด เดเดเด เดเดชเดฏเตเดเดฟเดเตเดเต เด เดชเตเดฐเดถเตเดจเด เดชเดฐเดฟเดนเดฐเดฟเดเตเดเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเดพเด. เดจเดพเตฝเดเตเดเดตเดฒเดเตพ เดธเดพเดงเดพเดฐเดฃ เดฎเตเดถเดชเตเดชเตเดฑเดคเตเดคเต เดเดฟเดเดเตเดเตเดจเตเดจเต, เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตผ เด เดต เด เดตเดฟเดเตเดฏเตเดณเตเดณเดชเตเดชเตเตพ เดเดเตเดคเตเดคเต เดคเดฟเดฐเดฟเดเต เดตเดฏเตเดเตเดเตเด. เดเดตเดฟเดเตเดฏเดพเดฃเต เดธเดฟเตปเดเตเดฐเตเดฃเตเดธเตเดทเดจเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเตเดเตเด เดชเตเดฐเดถเตเดจเดเตเดเตพ เดเดฃเตเดเดพเดเตเดจเตเดจเดคเต, เดเตเดคเตเดฏเดฎเดพเดฏเดฟ เดเดชเตเดชเตเดดเดพเดฃเต เดซเตเตผเดเตเดเตเดเตพ เดเดเตเดเตเดเตเดฃเตเดเดคเต? เดชเตเดฒเดเต เดเดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดจเตเดคเตเดเตเดฏเตเดฏเตเด? เดฎเตเดคเดฒเดพเดฏเดต. เดเดจเตเดจเดพเตฝ เดเดฆเตเดฏเด, เดจเดฎเตเดเตเดเต เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดฐเดเดญเดฟเดเตเดเดพเด.
เดคเตเดฐเตเดกเตเดเตพ เดเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดเดเตเดเตพ เดตเดดเดฟ เดเดฐเต เดคเตเดฐเตเดกเต เดชเตเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต Task.Run
เดฐเตเดคเดฟ:
var cancelTokenSource = new CancellationTokenSource();
Action<int> create = (i) => RunPhilosopher(i, cancelTokenSource.Token);
for (int i = 0; i < philosophersAmount; i++)
{
int icopy = i;
// ะะพะผะตััะธัั ะทะฐะดะฐัั ะฒ ะพัะตัะตะดั ะฟัะปะฐ ะฟะพัะพะบะพะฒ. ะะตัะพะด RunDeadlock ะฝะต ะทะฐะฟััะบะฐะตัััั
// ััะฐะทั, ะฐ ะถะดะตั ัะฒะพะตะณะพ ะฟะพัะพะบะฐ. ะัะธะฝั
ัะพะฝะฝัะน ะทะฐะฟััะบ.
philosophers[i] = Task.Run(() => create(icopy), cancelTokenSource.Token);
}
เดคเตเดฐเตเดกเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเตเด เดจเตเดเตเดเดเดเตเดฏเตเดฏเตเดจเตเดจเดคเตเด เดเดชเตเดฑเตเดฑเดฟเดฎเตเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเดพเดฃเต เดคเตเดฐเตเดกเต เดชเตเตพ เดฐเตเดชเดเตฝเดชเตเดชเดจ เดเตเดฏเตเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเต. เด เดชเตเดณเดฟเดจเต เดเดพเดธเตโเดเตเดเตเดเดณเตเดเต เดเดฐเต เดเตเดฏเต เดเดฃเตเดเต, เด เดเดพเดธเตโเดเตเดเตเดเดณเตเดเต เดเดฃเตเดฃเด เด
เดจเตเดธเดฐเดฟเดเตเดเต CLR เดคเตเดฐเตเดกเตเดเตพ เดธเตเดทเตโเดเดฟเดเตเดเตเดเดฏเต เดเดฒเตเดฒเดพเดคเดพเดเตเดเตเดเดฏเต เดเตเดฏเตเดฏเตเดจเตเดจเต. เดเดฒเตเดฒเดพ AppDomains-เดจเตเด เดเดฐเต เดชเตเตพ. เด เดเตเดณเด เดฎเดฟเดเตเดเดตเดพเดฑเตเด เดเดชเตเดชเตเดดเตเด เดเดชเดฏเตเดเดฟเดเตเดเตเดฃเตเดเดคเดพเดฃเต, เดเดพเดฐเดฃเด... เดคเตเดฐเตเดกเตเดเตพ, เด
เดตเดฏเตเดเต เดเตเดฏเตเดเตพ เดฎเตเดคเดฒเดพเดฏเดต เดธเตเดทเตโเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเด เดเดฒเตเดฒเดพเดคเดพเดเตเดเตเดจเตเดจเดคเดฟเดจเตเด เดตเดฟเดทเดฎเดฟเดเตเดเตเดฃเตเดเดคเดฟเดฒเตเดฒ. เดจเดฟเดเตเดเตพเดเตเดเต เดเดคเต เดเดฐเต เดชเตเตพ เดเดฒเตเดฒเดพเดคเต เดคเดจเตเดจเต เดเตเดฏเตเดฏเดพเด, เดเดจเตเดจเดพเตฝ เดจเดฟเดเตเดเตพ เด
เดคเต เดจเตเดฐเดฟเดเตเดเต เดเดชเดฏเตเดเดฟเดเตเดเตเดฃเตเดเดฟเดตเดฐเตเด Thread
, เดเดฐเต เดคเตเดฐเตเดกเดฟเตปเตเดฑเต เดฎเตเตปเดเดฃเดจ เดฎเดพเดฑเตเดฑเตเดฃเตเด เดธเดจเตเดฆเตผเดญเดเตเดเดณเดฟเตฝ, เดเดเตเดเตพเดเตเดเต เดเดฐเต เดจเตเดฃเตเด เดชเตเดฐเดตเตผเดคเตเดคเดจเดฎเตเดณเตเดณเดชเตเดชเตเตพ, เดเดฐเต เดซเตเตผเดเตเดฐเตเดฃเตเดเต เดคเตเดฐเตเดกเดฟเดจเดพเดฏเดฟ เดเดคเต เดเดชเดฏเตเดเดชเตเดฐเดฆเดฎเดพเดฃเต.
เดฎเดฑเตเดฑเตเดพเดฐเต เดตเดพเดเตเดเดฟเตฝ, System.Threading.Tasks.Task
เดเตเดฒเดพเดธเต เดคเดจเตเดจเต Thread
, เดเดจเตเดจเดพเตฝ เดเดฒเตเดฒเดพเดคเตเดคเดฐเด เดธเตเดเดฐเตเดฏเดเตเดเดณเตเดเตเด เดเตเดเดฟ: เดฎเดฑเตเดฑเต เดเดพเดธเตโเดเตเดเตเดเดณเตเดเต เดเดฐเต เดฌเตเดฒเตเดเตเดเดฟเดจเต เดถเตเดทเด เดเดฐเต เดเดพเดธเตโเดเตเดเต เดธเดฎเดพเดฐเดเดญเดฟเดเตเดเดพเดจเตเดณเตเดณ เดเดดเดฟเดตเต, เดซเดเดเตเดทเดจเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด
เดต เดคเดฟเดฐเดฟเดเต เดจเตฝเดเตเด, เดธเตเดเดฐเตเดฏเดชเตเตผเดตเตเดตเด เดคเดเดธเตเดธเดชเตเดชเตเดเตเดคเตเดคเตเด, เดเตเดเดพเดคเต เดฎเดฑเตเดฑเต เดชเดฒเดคเตเด. เดฎเตเดคเดฒเดพเดฏเดต. เด
เดธเดฟเตปเดเต/เดตเตเดฏเตเดฑเตเดฑเต เดเตบเดธเตเดเตเดฐเดเตเดทเตปเดธเต (เดเดพเดธเตเดเต เด
เดเดฟเดธเตเดฅเดพเดจเดฎเดพเดเตเดเดฟเดฏเตเดณเตเดณ เด
เดธเดฟเตปเดเตเดฐเดฃเดธเต เดชเดพเดฑเตเดฑเตเตบ, เดเด เดเดชเตเดชเดฑเตเดทเดจเตเดเตพเดเตเดเดพเดฏเดฟ เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดตเดพเดเตเดฏเดเดเดจ เดชเดเตเดเดธเดพเดฐ) เดชเดฟเดจเตเดคเตเดฃเดฏเตเดเตเดเตเดจเตเดจเดคเดฟเดจเต เด
เดต เดเดตเดถเตเดฏเดฎเดพเดฃเต. เดเดคเดฟเดจเตเดเตเดเตเดฑเดฟเดเตเดเต เดชเดฟเดจเตเดจเตเดเต เดธเดเดธเดพเดฐเดฟเดเตเดเดพเด.
CancelationTokenSource
เดเตเดณเดฟเดเดเต เดคเตเดฐเตเดกเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดเดฐเต เดธเดฟเดเตเดจเดฒเดฟเตฝ เดคเตเดฐเตเดกเต เดธเตเดตเดฏเด เด
เดตเดธเดพเดจเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดเดตเดฟเดเต เด
เดคเต เดเดตเดถเตเดฏเดฎเดพเดฃเต.
เดธเดฎเดจเตเดตเดฏ เดชเตเดฐเดถเตเดจเดเตเดเตพ
เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเต เดคเดเดเตเดเต
เดถเดฐเดฟ, เดคเตเดฐเตเดกเตเดเตพ เดเดเตเดเดจเต เดธเตเดทเตเดเดฟเดเตเดเดพเดฎเตเดจเตเดจเต เดเดเตเดเตพเดเตเดเดฑเดฟเดฏเดพเด, เดเดเตเดเดญเดเตเดทเดฃเด เดชเดฐเตเดเตเดทเดฟเดเตเดเดพเด:
// ะัะพ ะบะฐะบะธะต ะฒะธะปะบะธ ะฒะทัะป. ะ ะฟัะธะผะตัั: 1 1 3 3 - 1ะน ะธ 3ะน ะฒะทัะปะธ ะฟะตัะฒัะต ะดะฒะต ะฟะฐัั.
private int[] forks = Enumerable.Repeat(0, philosophersAmount).ToArray();
// ะขะพ ะถะต, ััะพ RunPhilosopher()
private void RunDeadlock(int i, CancellationToken token)
{
// ะะดะฐัั ะฒะธะปะบั, ะฒะทััั ะตั. ะญะบะฒะธะฒะฐะปะตะฝัะฝะพ:
// while(true)
// if forks[fork] == 0
// forks[fork] = i+1
// break
// Thread.Sleep() ะธะปะธ Yield() ะธะปะธ SpinWait()
void TakeFork(int fork) =>
SpinWait.SpinUntil(() =>
Interlocked.CompareExchange(ref forks[fork], i+1, 0) == 0);
// ะะปั ะฟัะพััะพัั, ะฝะพ ะผะพะถะฝะพ ั Interlocked.Exchange:
void PutFork(int fork) => forks[fork] = 0;
while (true)
{
TakeFork(Left(i));
TakeFork(Right(i));
eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1);
PutFork(Left(i));
PutFork(Right(i));
Think(i);
// ะะฐะฒะตััะธัั ัะฐะฑะพัั ะฟะพ-ั
ะพัะพัะตะผั.
token.ThrowIfCancellationRequested();
}
}
เดเดตเดฟเดเต เดจเดฎเตเดฎเตพ เดเดฆเตเดฏเด เดเดเดคเตเดคเตเดฏเตเด เดชเดฟเดจเตเดจเตเดเต เดตเดฒเดคเตเดคเตเดฏเตเด เดซเตเตผเดเตเดเต เดเดเตเดเตเดเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเตเดจเตเดจเต, เด
เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเตเดฃเตเดเตเดเตเดเดฟเตฝ, เดเดเตเดเตพ เดญเดเตเดทเดฃเด เดเดดเดฟเดเตเดเต เดคเดฟเดฐเดฟเดเต เดตเดฏเตเดเตเดเตเด. เดเดฐเต เดซเตเตผเดเตเดเต เดเดเตเดเตเดเตเดจเตเดจเดคเต เดเดฑเตเดฑเตเดฎเดฟเดเต เดเดฃเต, เด
เดคเดพเดฏเดคเต. เดฐเดฃเตเดเต เดคเตเดฐเตเดกเตเดเตพเดเตเดเต เดเดฐเต เดธเดฎเดฏเด เดเดฐเตเดฃเตเดฃเด เดเดเตเดเตเดเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒ (เดคเตเดฑเตเดฑเต: เดซเตเตผเดเตเดเต เดธเตเดเดจเตเดฏเดฎเดพเดฃเตเดจเตเดจเต เดเดฆเตเดฏเดคเตเดคเตเดคเต เดตเดพเดฏเดฟเดเตเดเตเดจเตเดจเต, เดฐเดฃเตเดเดพเดฎเดคเตเดคเตเดคเต เด
เดคเต เดเตเดฏเตเดฏเตเดจเตเดจเต, เดเดฆเตเดฏเดคเตเดคเตเดคเต เดเดเตเดเตเดเตเดจเตเดจเต, เดฐเดฃเตเดเดพเดฎเดคเตเดคเตเดคเต เดเดเตเดเตเดเตเดจเตเดจเต). เดเดคเดฟเดจเดพเดฏเดฟ Interlocked.CompareExchange
, เดเดคเต เดเดฐเต เดชเตเดฐเตเดธเดธเตผ เดจเดฟเตผเดฆเตเดฆเตเดถเด เดเดชเดฏเตเดเดฟเดเตเดเต เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดฃเด (TSL
, XCHG
), เดเดฑเตเดฑเตเดฎเดฟเดเต เดธเตเดเตเดตเตปเดทเตเดฏเตฝ เดฑเตเดกเดฟเดเดเดฟเดจเตเด เดฑเตเดฑเตเดฑเดฟเดเดเดฟเดจเตเด เดตเตเดฃเตเดเดฟเดฏเตเดณเตเดณ เดฎเตเดฎเตเดฎเดฑเดฟเดฏเตเดเต เดเดฐเต เดญเดพเดเด เดฒเตเดเตเดเต เดเตเดฏเตเดฏเตเดจเตเดจเต. เดเดชเตเดชเด SpinWait เดจเดฟเตผเดฎเตเดฎเดพเดฃเดคเตเดคเดฟเดจเต เดคเตเดฒเตเดฏเดฎเดพเดฃเต while(true)
เดเดฐเต เดเตเดฑเดฟเดฏ "เดฎเดพเดเดฟเดเต" เดเดชเดฏเตเดเดฟเดเตเดเต เดฎเดพเดคเตเดฐเด - เดคเตเดฐเตเดกเต เดชเตเดฐเตเดธเดธเตเดธเตผ เดเดเตเดเตเดเตเดจเตเดจเต (Thread.SpinWait
), เดเดจเตเดจเดพเตฝ เดเดฟเดฒเดชเตเดชเตเตพ เดฎเดฑเตเดฑเตเดฐเต เดคเตเดฐเตเดกเดฟเดฒเตเดเตเดเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด เดเตเดฎเดพเดฑเตเดจเตเดจเต (Thread.Yeild
) เด
เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดฑเดเตเดเตเดจเตเดจเต (Thread.Sleep
).
เดเดจเตเดจเดพเตฝ เด เดชเดฐเดฟเดนเดพเดฐเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ, เดเดพเดฐเดฃเด ... เดคเตเดฐเตเดกเตเดเตพ เดเดเตป (เดเดจเดฟเดเตเดเต เดเดฐเต เดธเตเดเตเดเตปเดกเดฟเดจเตเดณเตเดณเดฟเตฝ) เดคเดเดเตเดเต: เดเดฒเตเดฒเดพ เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเตเด เด เดตเดฐเตเดเต เดเดเดคเต เดจเดพเตฝเดเตเดเดตเดฒ เดเดเตเดเตเดเตเดจเตเดจเต, เดชเดเตเดทเต เดถเดฐเดฟเดฏเดพเดฏ เดเดจเตเดจเตเดฎเดฟเดฒเตเดฒ. เดซเตเตผเดเตเดเต เด เดฑเตเดฏเตโเดเตเดเต เด เดชเตเดชเตเตพ เดฎเตเดฒเตเดฏเดเตเดเดณเตเดฃเตเดเต: 1 2 3 4 5.
เดเดฟเดคเตเดฐเดคเตเดคเดฟเตฝ, เดคเตเดฐเตเดกเตเดเตพ เดคเดเดฏเตเดจเตเดจเต (เดกเตเดกเตเดฒเตเดเตเดเต). เดชเดเตเด เดจเดฟเตผเดตเตเดตเดนเดฃเดคเตเดคเต เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเต, เดเตเดตเดชเตเดชเต เดธเดฎเดจเตเดตเดฏเดคเตเดคเต เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเต, เดเดพเดฐเดจเดฟเดฑเด เดคเตเดฐเตเดกเต เดเดฑเดเตเดเตเดเดฏเดพเดฃเตเดจเตเดจเต เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเต. เดตเดเตเดฐเดเตเดเตพ เดเดพเดธเตโเดเตเดเตเดเดณเตเดเต เดตเดฟเดเตเดทเตเดชเดฃ เดธเดฎเดฏเดคเตเดคเต เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเต.
เดฆเดพเตผเดถเดจเดฟเดเดฐเตเดเต เดตเดฟเดถเดชเตเดชเต
เดจเดฟเดเตเดเตพเดเตเดเต เดเดฟเดจเตเดคเดฟเดเตเดเดพเตป เดงเดพเดฐเดพเดณเด เดญเดเตเดทเดฃเด เดเดตเดถเตเดฏเดฎเดฟเดฒเตเดฒเตเดเตเดเดฟเดฒเตเด, เดตเดฟเดถเดชเตเดชเต เดคเดคเตเดคเตเดตเดเดฟเดจเตเดค เดเดชเตเดเตเดทเดฟเดเตเดเดพเตป เดเดฐเตเดฏเตเด เดชเตเดฐเตเดฐเดฟเดชเตเดชเดฟเดเตเดเตเด. เดจเดฎเตเดฎเตเดเต เดชเตเดฐเดถเตเดจเดคเตเดคเดฟเตฝ เดคเตเดฐเตเดกเต เดชเดเตเดเดฟเดฃเดฟเดฏเตเดเต เดธเดพเดนเดเดฐเตเดฏเด เด เดจเตเดเดฐเดฟเดเตเดเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเดพเด. เดเดฐเต เดคเตเดฐเตเดกเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดฎเตเดชเตเตพ, เดชเดเตเดทเต เดเดพเดฐเตเดฏเดฎเดพเดฏ เดเตเดฒเดฟเดฏเดฟเดฒเตเดฒเดพเดคเต, เดฎเดฑเตเดฑเตเดฐเต เดตเดฟเดงเดคเตเดคเดฟเตฝ เดชเดฑเดเตเดเดพเตฝ, เดเดคเต เด เดคเต เดคเดเดธเตเดธเดฎเดพเดฃเต, เดเดชเตเดชเตเตพ เดคเตเดฐเตเดกเต เดเดฑเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ, เดชเดเตเดทเต เดธเดเตเดตเดฎเดพเดฏเดฟ เดเดจเตเดคเตเดเตเดเดฟเดฒเตเด เดเดดเดฟเดเตเดเดพเตป เดจเตเดเตเดเตเดจเตเดจเต, เดชเดเตเดทเต เดญเดเตเดทเดฃเดฎเดฟเดฒเตเดฒ. เดเดเดฏเตโเดเตเดเดฟเดเต เดคเดเดฏเตเดจเตเดจเดคเต เดเดดเดฟเดตเดพเดเตเดเดพเตป, เดฎเดฑเตเดฑเตเดจเตเดจเต เดเดเตเดเตเดเดพเตป เดเดดเดฟเดฏเตเดจเตเดจเดฟเดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดเตเดเตพ เดซเตเตผเดเตเดเต เดคเดฟเดฐเดฟเดเต เดเดเตเด.
// ะขะพ ะถะต ััะพ ะธ ะฒ RunDeadlock, ะฝะพ ัะตะฟะตัั ะบะปะฐะดะตะผ ะฒะธะปะบั ะฝะฐะทะฐะด ะธ ะดะพะฑะฐะฒะปัะตะผ ะฟะปะพั
ะธั
ัะธะปะพัะพัะพะฒ.
private void RunStarvation(int i, CancellationToken token)
{
while (true)
{
bool hasTwoForks = false;
var waitTime = TimeSpan.FromMilliseconds(50);
// ะะปะพั
ะพะน ัะธะปะพัะพัะพะฒ ะผะพะถะตั ัะถะต ะธะผะตัั ะฒะธะปะบั:
bool hasLeft = forks[Left(i)] == i + 1;
if (hasLeft || TakeFork(Left(i), i + 1, waitTime))
{
if (TakeFork(Right(i), i + 1, TimeSpan.Zero))
hasTwoForks = true;
else
PutFork(Left(i)); // ะะฝะพะณะดะฐ ะฟะปะพั
ะพะน ัะธะปะพัะพั ะพัะดะฐะตั ะฒะธะปะบั ะฝะฐะทะฐะด.
}
if (!hasTwoForks)
{
if (token.IsCancellationRequested) break;
continue;
}
eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1);
bool goodPhilosopher = i % 2 == 0;
// ะ ะฟะปะพั
ะพะน ัะธะปะพัะพั ะทะฐะฑัะฒะฐะตั ะฟะพะปะพะถะธัั ัะฒะพั ะฒะธะปะบั ะพะฑัะฐัะฝะพ:
if (goodPhilosopher)
PutFork(Left(i));
// ะ ะตัะปะธ ะธ ะฟัะฐะฒัั ะฝะต ะฟะพะปะพะถะธั, ัะพ ั
ะพัะพัะธะต ะฑัะดัั ะฒะพะพะฑัะต ะฑะตะท ะตะดั.
PutFork(Right(i));
Think(i);
if (token.IsCancellationRequested)
break;
}
}
// ะขะตะฟะตัั ะผะพะถะฝะพ ะถะดะฐัั ะพะฟัะตะดะตะปะตะฝะฝะพะต ะฒัะตะผั.
bool TakeFork(int fork, int philosopher, TimeSpan? waitTime = null)
{
return SpinWait.SpinUntil(
() => Interlocked.CompareExchange(ref forks[fork], philosopher, 0) == 0,
waitTime ?? TimeSpan.FromMilliseconds(-1)
);
}
เด เดเตเดกเดฟเตปเตเดฑเต เดชเตเดฐเดงเดพเดจ เดเดพเดฐเตเดฏเด, เดจเดพเดฒเต เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเดฟเตฝ เดฐเดฃเตเดเตเดชเตเดฐเตเด เด เดตเดฐเตเดเต เดเดเดคเต เดจเดพเตฝเดเตเดเดตเดฒ เดคเดพเดดเตเดฏเดฟเดเดพเตป เดฎเดฑเดเตเดเตเดจเตเดจเต เดเดจเตเดจเดคเดพเดฃเต. เด เดตเตผ เดเตเดเตเดคเตฝ เดญเดเตเดทเดฃเด เดเดดเดฟเดเตเดเตเดจเตเดจเต, เดฎเดฑเตเดฑเตเดณเตเดณเดตเตผ เดชเดเตเดเดฟเดฃเดฟ เดเดฟเดเดเตเดเดพเตป เดคเตเดเดเตเดเตเดจเตเดจเต, เดคเตเดฐเตเดกเตเดเตพเดเตเดเต เดเดฐเต เดฎเตเตปเดเดฃเดจเดฏเตเดฃเตเดเตเดเตเดเดฟเดฒเตเด. เดเดตเดฟเดเต เด เดตเตผ เดชเตเตผเดฃเตเดฃเดฎเดพเดฏเตเด เดชเดเตเดเดฟเดฃเดฟ เดเดฟเดเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ, เดเดพเดฐเดฃเด ... เดฎเตเดถเด เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตผ เดเดฟเดฒเดชเตเดชเตเตพ เด เดตเดฐเตเดเต เดจเดพเตฝเดเตเดเดตเดฒเดเตพ เดชเดฟเดจเตเดจเตเดเตเดเต เดตเดฏเตเดเตเดเตเดจเตเดจเต. เดจเดฒเตเดฒเดตเตผ เดเตเดคเตเดคเดฏเตเดเตเดเดพเตพ 5 เดฎเดเดเตเดเต เดเตเดฑเดตเดพเดฃเต เดเดดเดฟเดเตเดเตเดจเตเดจเดคเตเดจเตเดจเต เดเดคเต เดฎเดพเดฑเตเดจเตเดจเต. เด เดคเดฟเดจเดพเตฝ เดเตเดกเดฟเดฒเต เดเดฐเต เดเตเดฑเดฟเดฏ เดชเดฟเดถเดเต เดชเตเดฐเดเดเดจเดคเตเดคเดฟเตฝ เดเตเดฑเดตเตเดฃเตเดเดพเดเตเดเตเดจเตเดจเต. เดเดฒเตเดฒเดพ เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเตเด เดเดเดคเต เดจเดพเตฝเดเตเดเดตเดฒ เดเดเตเดเตเดเตเดฎเตเดชเตเตพ เดเดฐเต เด เดชเตเตผเดต เดธเดพเดนเดเดฐเตเดฏเด เดธเดพเดงเตเดฏเดฎเดพเดฃเต เดเดจเตเดจเดคเตเด เดเดตเดฟเดเต เดถเตเดฐเดฆเตเดงเดฟเดเตเดเตเดฃเตเดเดคเดพเดฃเต, เดตเดฒเดคเต เดเดจเตเดจเตเดฎเดฟเดฒเตเดฒ, เด เดตเตผ เดเดเดคเต เดคเดพเดดเตเดเตเดเต เดตเดฏเตเดเตเดเตเด, เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเด, เดเดเดคเตเดคเตเดคเต เดตเตเดฃเตเดเตเด เดเดเตเดเตเดเตเด เดฎเตเดคเดฒเดพเดฏเดต. เด เดธเดพเดนเดเดฐเตเดฏเด เดชเดเตเดเดฟเดฃเดฟเดฏเดพเดฃเต, เดชเดฐเดธเตเดชเดฐ เดคเดเดธเตเดธเด เดชเตเดฒเต. เดเดจเดฟเดเตเดเต เด เดคเต เดเดตเตผเดคเตเดคเดฟเดเตเดเดพเตป เดเดดเดฟเดเตเดเดฟเดฒเตเดฒ. เดฐเดฃเตเดเต เดฎเตเดถเด เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตผ เดฐเดฃเตเดเต เดซเตเตผเดเตเดเตเดเดณเตเด เดเดเตเดคเตเดคเดคเตเด เดฐเดฃเตเดเต เดจเดฒเตเดฒเดตเตผ เดชเดเตเดเดฟเดฃเดฟ เดเดฟเดเดเตเดเตเดจเตเดจเดคเตเดฎเดพเดฏ เดเดฐเต เดธเดพเดนเดเดฐเตเดฏเดคเตเดคเดฟเดจเดพเดฏเตเดณเตเดณ เดเดฐเต เดเดฟเดคเตเดฐเด เดเตเดตเดเตเดฏเตเดฃเตเดเต.
เดคเตเดฐเตเดกเตเดเตพ เดเดฟเดฒเดชเตเดชเตเตพ เดเดฃเตผเดจเตเดจเต เดเดฐเต เดตเดฟเดญเดตเด เดจเตเดเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเตเดจเตเดจเดคเต เดเดตเดฟเดเต เดจเดฟเดเตเดเตพเดเตเดเต เดเดพเดฃเดพเตป เดเดดเดฟเดฏเตเด. เดจเดพเดฒเดฟเตฝ เดฐเดฃเตเดเตเดฃเตเดฃเด เดเดจเตเดจเตเด เดเตเดฏเตเดฏเตเดจเตเดจเดฟเดฒเตเดฒ (เดฎเตเดเดณเดฟเดฒเตเดณเตเดณ เดชเดเตเด เดเตเดฐเดพเดซเต).
เดเดฐเต เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตปเตเดฑเต เดฎเดฐเดฃเด
เดถเดฐเดฟ, เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเตเดเต เดฎเดนเดคเตเดคเดพเดฏ เด
เดคเตเดคเดพเดดเดคเตเดคเต เดคเดเดธเตเดธเดชเตเดชเตเดเตเดคเตเดคเตเดจเตเดจ เดฎเดฑเตเดฑเตเดฐเต เดชเตเดฐเดถเตเดจเด, เด
เดตเดฐเดฟเตฝ เดเดฐเดพเตพ เดชเตเดเตเดเตเดจเตเดจเต เดเตเดเดณเดฟเตฝ เดจเดพเตฝเดเตเดเดตเดฒเดฏเตเดฎเดพเดฏเดฟ เดฎเดฐเดฟเดเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ (เด
เดฏเดพเตพ เด
เดเตเดเดจเต เดคเดจเตเดจเต เดธเดเดธเตเดเดฐเดฟเดเตเดเดชเตเดชเตเดเตเด). เด
เดชเตเดชเตเตพ เด
เดฏเตฝเดเตเดเดพเตผ เดเดเตเดเดญเดเตเดทเดฃเด เดเดดเดฟเดเตเดเดพเดคเต เดตเดฟเดเตเด. เด เดเตเดธเดฟเดจเดพเดฏเดฟ เดจเดฟเดเตเดเตพเดเตเดเต เดธเตเดตเดฏเด เดเดฐเต เดเดฆเดพเดนเดฐเดฃ เดเตเดกเต เดเตเดฃเตเดเตเดตเดฐเดพเตป เดเดดเดฟเดฏเตเด, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต เด
เดคเต เดตเดฒเดฟเดเตเดเตเดฑเดฟเดฏเดชเตเดชเตเดเตเดจเตเดจเต NullReferenceException
เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตป เดซเตเตผเดเตเดเตเดเตพ เดเดเตเดคเตเดค เดถเตเดทเด. เดเตเดเดพเดคเต, เดเดดเดฟเดตเดพเดเตเดเตฝ เดเตเดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเดฟเดฒเตเดฒ เดเตเดเดพเดคเต เดเตเดณเดฟเดเดเต เดเตเดกเต เด
เดคเต เดชเดฟเดเดฟเดเตเดเตเดเดฏเตเดฎเดฟเดฒเตเดฒ (เดเดคเดฟเดจเดพเดฏเดฟ AppDomain.CurrentDomain.UnhandledException
เดฎเตเดคเดฒเดพเดฏเดต). เด
เดคเดฟเดจเดพเตฝ, เดคเตเดฐเตเดกเตเดเดณเดฟเตฝ เดคเดจเตเดจเตเดฏเตเด เดญเดเดเดฟเดฏเตเดณเตเดณ เด
เดตเดธเดพเดจเดฟเดชเตเดชเดฟเดเตเดเดฒเตเดเตเดฏเตเด เดชเดฟเดถเดเต เดเตเดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเตเดจเตเดจเดตเตผ เดเดตเดถเตเดฏเดฎเดพเดฃเต.
เดตเตเดฏเดฟเดฑเตเดฑเตผ
เดถเดฐเดฟ, เดชเตเดฐเดคเดฟเดธเดจเตเดงเดฟเดเตพ, เดชเดเตเดเดฟเดฃเดฟ, เดฎเดฐเดฃเดเตเดเตพ เดเดจเตเดจเดฟเดตเดฏเตเดเต เด เดชเตเดฐเดถเตเดจเด เดเดเตเดเตพ เดเดเตเดเดจเต เดชเดฐเดฟเดนเดฐเดฟเดเตเดเตเด? เดซเตเตผเดเตเดเตเดเดณเดฟเดฒเตเดเตเดเต เดเดเตเดเตพ เดเดฐเต เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดจเต เดฎเดพเดคเตเดฐเดฎเต เด เดจเตเดตเดฆเดฟเดเตเดเต, เด เดธเตเดฅเดฒเดคเตเดคเดฟเดจเดพเดฏเดฟ เดเดเตเดเตพ เดคเตเดฐเตเดกเตเดเดณเตเดเต เดชเดฐเดธเตเดชเดฐ เดเดดเดฟเดตเดพเดเตเดเตฝ เดเตเตผเดเตเดเตเด. เดเดคเต เดเดเตเดเดจเต เดเตเดฏเตเดฏเดพเด? เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเตเดเต เด เดเตเดคเตเดคเดพเดฏเดฟ เดเดฐเต เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดจเต เดซเตเตผเดเตเดเตเดเตพ เดเดเตเดเตเดเดพเตป เด เดจเตเดตเดพเดฆเด เดจเตฝเดเตเดจเตเดจ เดเดฐเต เดตเตเดฏเดฟเดฑเตเดฑเตผ เดเดฃเตเดเตเดจเตเดจเต เดเดฐเตเดคเตเด. เด เดตเตเดฏเดฟเดฑเตเดฑเดฑเต เดเดเตเดเดจเต เดเดฃเตเดเดพเดเตเดเดฃเด, เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตผ เด เดตเดจเตเดเต เดเดเตเดเดจเต เดเตเดฆเดฟเดเตเดเตเด เดเดจเตเดจเดฟเดต เดฐเดธเดเดฐเดฎเดพเดฏ เดเตเดฆเตเดฏเดเตเดเดณเดพเดฃเต.
เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตผ เดซเตเตผเดเตเดเตเดเดณเดฟเดฒเตเดเตเดเตเดณเตเดณ เดชเตเดฐเดตเตเดถเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เดตเตเดฏเดฟเดฑเตเดฑเดฑเตเดเต เดจเดฟเดฐเดจเตเดคเดฐเด เดเดตเดถเตเดฏเดชเตเดชเตเดเตเด เดเดจเตเดจเดคเดพเดฃเต เดเดฑเตเดฑเดตเตเด เดฒเดณเดฟเดคเดฎเดพเดฏ เดฎเดพเตผเดเด. เด. เดเดชเตเดชเตเตพ เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตผ เด เดเตเดคเตเดคเตเดณเตเดณ เดเดฐเต เดจเดพเตฝเดเตเดเดตเดฒเดฏเตเดเตเดเดพเดฏเดฟ เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเดฟเดฒเตเดฒ, เดชเดเตเดทเต เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเด เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดตเตเดฏเดฟเดฑเตเดฑเดฑเตเดเต เดเตเดฆเดฟเดเตเดเตเด. เดเดฆเตเดฏเด เดเดเตเดเตพ เดเดคเดฟเดจเดพเดฏเดฟ เดฏเตเดธเตผ เดธเตเดชเตเดธเต เดฎเดพเดคเตเดฐเดฎเต เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเตเดณเตเดณเต;
เดเดชเดฏเตเดเตเดคเต เดธเตเดฅเดฒ เดชเดฐเดฟเดนเดพเดฐเดเตเดเตพ
เดเดฐเต เดจเดพเตฝเดเตเดเดตเดฒเดฏเตเด เดฐเดฃเตเดเต เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเตเด เดเดชเดฏเตเดเดฟเดเตเดเต เดเดเตเดเตพ เดฎเตเดฎเตเดชเต เดเตเดฏเตเดค เด เดคเต เดเดพเดฐเตเดฏเด เดเดตเดฟเดเต เดเดเตเดเตพ เดเตเดฏเตเดฏเตเด, เดเดเตเดเตพ เดเดฐเต เดฒเตเดชเตเดชเดฟเตฝ เดเดฑเดเตเดเดฟ เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเด. เดเดจเตเดจเดพเตฝ เดเดชเตเดชเตเตพ เด เดคเต เดเดฒเตเดฒเดพ เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเตเด เดเดฏเดฟเดฐเดฟเดเตเดเตเด, เด เดคเต เดชเตเดฒเต, เดเดฐเตเดฏเตเดฐเต เดจเดพเตฝเดเตเดเดตเดฒ, เด เดคเดพเดฏเดคเต. เดตเตเดฏเดฟเดฑเตเดฑเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เด "เดธเตเดตเตผเดฃเตเดฃ เดจเดพเตฝเดเตเดเดตเดฒ" เดเดเตเดคเตเดค เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตป เดฎเดพเดคเตเดฐเดฎเต เดเดดเดฟเดเตเดเต เดเดจเตเดจเต เดจเดฎเตเดเตเดเต เดชเดฑเดฏเดพเด. เดเดคเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดเดเตเดเตพ SpinLock เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต.
private static SpinLock spinLock = new SpinLock(); // ะะฐั "ะพัะธัะธะฐะฝั"
private void RunSpinLock(int i, CancellationToken token)
{
while (true)
{
// ะะทะฐะธะผะฝะฐั ะฑะปะพะบะธัะพะฒะบะฐ ัะตัะตะท busy waiting. ะัะทัะฒะฐะตะผ ะดะพ try, ััะพะฑั
// ะฒัะฑัะฐัะธัั ะธัะบะปััะตะฝะธะต ะฒ ัะปััะฐะต ะพัะธะฑะบะธ ะฒ ัะฐะผะพะผ SpinLock.
bool hasLock = false;
spinLock.Enter(ref hasLock);
try
{
// ะะดะตัั ะผะพะถะตั ะฑััั ัะพะปัะบะพ ะพะดะธะฝ ะฟะพัะพะบ (mutual exclusion).
forks[Left(i)] = i + 1; // ะะตัะตะผ ะฒะธะปะบั ััะฐะทั, ะฑะตะท ะพะถะธะดะฐะฝะธั.
forks[Right(i)] = i + 1;
eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1);
forks[Left(i)] = 0;
forks[Right(i)] = 0;
}
finally
{
if(hasLock) spinLock.Exit(); // ะะทะฑะตะณะฐะตะผ ะฟัะพะฑะปะตะผั ัะพ ัะผะตัััั ัะธะปะพัะพัะฐ.
}
Think(i);
if (token.IsCancellationRequested)
break;
}
}
SpinLock
เดเดคเต เดเดฐเต เดฌเตเดฒเตเดเตเดเดฑเดพเดฃเต, เดเดเดฆเตเดถเด เดชเดฑเดเตเดเดพเตฝ, เดธเดฎเดพเดจเดฎเดพเดฃเต while(true) { if (!lock) break; }
, เดเดจเตเดจเดพเตฝ เดเดณเตเดณเดคเดฟเดจเตเดเตเดเดพเตพ เดเตเดเตเดคเตฝ "เดฎเดพเดเดฟเดเต" เดเดชเดฏเตเดเดฟเดเตเดเต SpinWait
(เด
เดตเดฟเดเต เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเต). เดเดชเตเดชเตเตพ เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดตเดฐเต เดเดเตเดเดจเต เดเดฃเตเดฃเดพเดฎเตเดจเตเดจเตเด เด
เดตเดฐเต เด
เตฝเดชเตเดชเด เดเดฑเดเตเดเดฃเดฎเตเดจเตเดจเตเด เด
เดคเดฟเดฒเตเดฑเต เดเดพเดฐเตเดฏเดเตเดเตพ เดเตเดฏเตเดฏเดพเดฎเตเดจเตเดจเตเด เด
เดตเดจเดฑเดฟเดฏเดพเด. เดฎเตเดคเดฒเดพเดฏเดต เดชเตเดคเตเดตเต, เดเดชเตเดฑเตเดฑเดฟเดฎเตเดธเต เดเตเดฏเตเดฏเดพเตป เดธเดพเดงเตเดฏเดฎเดพเดฏเดคเตเดฒเตเดฒเดพเด เดเตเดฏเตเดฏเตเดจเตเดจเต. เดเดจเตเดจเดพเตฝ เดเดคเต เดเดชเตเดชเตเดดเตเด เดชเตเดฐเตเดธเดธเตผ เดตเดฟเดญเดตเดเตเดเตพ เดคเดฟเดจเตเดจเตเดเดฏเตเด เดเดฐเต เดคเตเดฐเตเดกเต เดเตเดตเดถเด เดตเดฏเตเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจ เด
เดคเต เดธเดเตเดตเดฎเดพเดฏ เดฒเตเดชเตเดชเดพเดฃเตเดจเตเดจเต เดจเดพเด เดเตผเดเตเดเดฃเด, เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเดฟเตฝ เดเดฐเดพเตพ เดฎเดฑเตเดฑเตเดณเตเดณเดตเดฐเต เด
เดชเตเดเตเดทเดฟเดเตเดเต เดเตเดเตเดคเตฝ เดฎเตเตปเดเดฃเดจ เดจเตฝเดเดฟเดฏเดพเตฝ เดชเดเตเดเดฟเดฃเดฟเดฏเดฟเดฒเตเดเตเดเต เดจเดฏเดฟเดเตเดเตเดเตเดเดพเด, เดชเดเตเดทเต เดเดฐเต เดเตเตพเดกเตป เดซเตเตผเดเตเดเต เดเดฒเตเดฒ (เดฎเตเตปเดเดฃเดจ เดตเดฟเดชเดฐเตเดค เดชเตเดฐเดถเตเดจเด ). เด
เดคเดฟเดจเดพเตฝ, เดฎเตเดจเตเดจเดพเด เดเดเตเดทเดฟ เดเตเดณเตเดเดณเต เดจเตเดธเตเดฑเตเดฑเดกเต เดฒเตเดเตเดเตเดเดณเต เดฎเดฑเตเดฑเต เดเดถเตเดเดฐเตเดฏเดเตเดเดณเต เดเดฒเตเดฒเดพเดคเต, เดชเดเตเดเดฟเดเตเด เดฎเตเดฎเตเดฎเดฑเดฟเดฏเดฟเดฒเต เดตเดณเดฐเต เดเตเดฑเดฟเดฏ เดฎเดพเดฑเตเดฑเดเตเดเตพเดเตเดเต เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เดเดเตเดเตพ เดเดคเต เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเต.
เดตเตเดฃเตเดเดฟ เดตเดฐเดฏเตเดเตเดเตเดจเตเดจเต SpinLock
. เดธเตเดเตเดฐเตเดฎเตเดเตพ เดธเตเดตเตผเดฃเตเดฃ เดจเดพเตฝเดเตเดเดตเดฒเดฏเตเดเตเดเดพเดฏเดฟ เดจเดฟเดฐเดจเตเดคเดฐเด "เดชเตเดฐเดพเดเตเดเด" เดเตเดฏเตเดฏเตเดจเตเดจเต. เดชเดฐเดพเดเดฏเดเตเดเตพ เดธเดเดญเดตเดฟเดเตเดเตเดจเตเดจเต - เดเดฟเดคเตเดฐเดคเตเดคเดฟเตฝ เดนเตเดฒเตเดฑเตเดฑเต เดเตเดฏเตเดค เดชเตเดฐเดฆเตเดถเด. เดเตเดฑเตเดเตพ เดชเตเตผเดฃเตเดฃเดฎเดพเดฏเดฟ เดเดชเดฏเตเดเดฟเดเตเดเดฟเดเตเดเดฟเดฒเตเดฒ: เด เดจเดพเดฒเต เดคเตเดฐเตเดกเตเดเดณเดพเตฝ เดเดเดฆเตเดถเด 2/3 เดฎเดพเดคเตเดฐเด.
เดเดตเดฟเดเต เดฎเดฑเตเดฑเตเดฐเต เดชเดฐเดฟเดนเดพเดฐเด เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเต เดฎเดพเดคเตเดฐเดฎเดพเดฃเต Interlocked.CompareExchange
เดฎเตเดเดณเดฟเดฒเต เดเตเดกเดฟเตฝ เดเดพเดฃเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจ เด
เดคเต เดธเดเตเดตเดฎเดพเดฏ เดเดพเดคเตเดคเดฟเดฐเดฟเดชเตเดชเตเดเต (เดชเดเตเดเดฟเดฃเดฟ เดเดฟเดเดเตเดเตเดจเตเดจ เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเดฟเตฝ), เดเดจเตเดจเดพเตฝ เดเดคเต เดเดคเดฟเดจเดเด เดชเดฑเดเตเดเดคเตเดชเตเดฒเต, เดธเตเดฆเตเดงเดพเดจเตเดคเดฟเดเดฎเดพเดฏเดฟ เดคเดเดฏเตเดจเตเดจเดคเดฟเดฒเตเดเตเดเต เดจเดฏเดฟเดเตเดเตเดเตเดเดพเด.
เดเตบ Interlocked
เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ เดเดณเตเดณเดคเต เดเดจเตเดจเต เดชเดฑเดฏเตเดฃเตเดเดคเดพเดฃเต CompareExchange
, เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ เดเดฑเตเดฑเตเดฎเดฟเดเต เดตเดพเดฏเดจเดฏเตเดเตเดเตเด เดเดดเตเดคเตเดคเดฟเดจเตเดฎเตเดณเตเดณ เดฎเดฑเตเดฑเต เดฐเตเดคเดฟเดเดณเตเด. เดฎเดพเดฑเตเดฑเด เดเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเดฟเดฒเตเดเต, เดฎเดฑเตเดฑเตเดฐเต เดคเตเดฐเตเดกเต เด
เดคเดฟเตปเตเดฑเต เดฎเดพเดฑเตเดฑเดเตเดเตพ เดตเดฐเตเดคเตเดคเดฟเดฏเดพเตฝ (1 เดตเดพเดฏเดฟเดเตเดเตเด, 2 เดตเดพเดฏเดฟเดเตเดเตเด, 2 เดเดดเตเดคเตเด, เดเดดเตเดคเตเด 1 เดฎเตเดถเดฎเดพเดฃเต), เดเดฐเต เดฎเตเดฒเตเดฏเดคเตเดคเดฟเดฒเตเดเตเดเต (เดเตปเตเดฑเตผเดฒเตเดเตเดเตเดกเต เดเดจเดฟเดคเดฟเดเดเต เดชเดพเดฑเตเดฑเตเตบ) เดธเดเตเดเตเตผเดฃเตเดฃเดฎเดพเดฏ เดฎเดพเดฑเตเดฑเดเตเดเตพเดเตเดเต เดเดคเต เดเดชเดฏเตเดเดฟเดเตเดเดพเด.
เดเตเตผเดฃเตฝ เดฎเตเดกเต เดชเดฐเดฟเดนเดพเดฐเดเตเดเตพ
เดเดฐเต เดฒเตเดชเตเดชเดฟเตฝ เดตเดฟเดญเดตเดเตเดเตพ เดชเดพเดดเดพเดเตเดเดพเดคเดฟเดฐเดฟเดเตเดเดพเตป, เดเดฐเต เดคเตเดฐเตเดกเต เดเดเตเดเดจเต เดคเดเดฏเดพเดฎเตเดจเตเดจเต เดจเตเดเตเดเดพเด. เดฎเดฑเตเดฑเตเดฐเต เดตเดฟเดงเดคเตเดคเดฟเตฝ เดชเดฑเดเตเดเดพเตฝ, เดจเดฎเตเดฎเตเดเต เดเดฆเดพเดนเดฐเดฃเด เดคเตเดเดฐเตเดจเตเดจเดคเดฟเดฒเตเดเต, เดตเตเดฏเดฟเดฑเตเดฑเตผ เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดจเต เดเดเตเดเดจเต เดเดฑเดเตเดเตเดเดฏเตเด เดเดตเดถเตเดฏเดฎเตเดณเตเดณเดชเตเดชเตเตพ เดฎเดพเดคเตเดฐเด เด
เดตเดจเต เดเดฃเตผเดคเตเดคเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต เดเดจเตเดจเต เดจเตเดเตเดเดพเด. เดเดฆเตเดฏเด, เดเดชเตเดชเดฑเตเดฑเตเดฑเดฟเดเดเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตปเตเดฑเต เดเตเตผเดฃเตฝ เดฎเตเดกเต เดตเดดเดฟ เดเดคเต เดเดเตเดเดจเต เดเตเดฏเตเดฏเดพเดฎเตเดจเตเดจเต เดจเตเดเตเดเดพเด. เด
เดตเดฟเดเตเดฏเตเดณเตเดณ เดเดฒเตเดฒเดพ เดเดเดจเดเดณเตเด เดชเดฒเดชเตเดชเตเดดเตเด เดเดชเดฏเตเดเตเดคเต เดธเตเดฅเดฒเดคเตเดคเตเดเตเดเดพเตพ เดฎเดจเตเดฆเดเดคเดฟเดฏเดฟเดฒเดพเดฃเต เด
เดตเดธเดพเดจเดฟเดเตเดเตเดจเตเดจเดคเต. เดจเดฟเดฐเดตเดงเดฟ เดคเดตเดฃ เดชเดคเตเดเตเดเต, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต AutoResetEvent
เดเดฐเตเดชเดเตเดทเต 53 เดฎเดเดเตเดเต เดชเดคเตเดเตเดเต SpinLock
[เดฑเดฟเดเตเดเตผ]. เดเดจเตเดจเดพเตฝ เด
เดตเดฐเตเดเต เดธเดนเดพเดฏเดคเตเดคเตเดเต, เดจเดฟเดเตเดเตพเดเตเดเต เดฎเตเดดเตเดตเตป เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดฒเตเดเดจเตเดณเดฎเตเดณเตเดณ เดชเตเดฐเดเตเดฐเดฟเดฏเดเตพ เดธเดฎเดจเตเดตเดฏเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเตเด, เดฎเดพเดจเตเดเต เดเตเดฏเตเดคเดพเดฒเตเด เด
เดฒเตเดฒเดพเดคเตเดฏเตเด.
เด
เดฐเดจเตเดฑเตเดฑเดพเดฃเตเดเดฟเดฒเตเดฑเต เดฎเตเดฎเตเดชเต Dijkstra เดจเดฟเตผเดฆเตเดฆเตเดถเดฟเดเตเด เดเดฐเต เดธเตเดฎเดพเดซเตเดฑเดพเดฃเต เดเดตเดฟเดเต เด
เดเดฟเดธเตเดฅเดพเดจ เดฐเตเดชเดเตฝเดชเตเดชเดจ. เดเดฐเต เดธเตเดฎเดพเดซเตเตผ, เดฒเดณเดฟเดคเดฎเดพเดฏเดฟ เดชเดฑเดเตเดเดพเตฝ, เดธเดฟเดธเตเดฑเตเดฑเด เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดเตเดเตเดจเตเดจ เดเดฐเต เดชเตเดธเดฟเดฑเตเดฑเตเดตเต เดชเตเตผเดฃเตเดฃเดธเดเดเตเดฏเดฏเดพเดฃเต, เด
เดคเดฟเตฝ เดฐเดฃเตเดเต เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดเตพ - เดเตเดเตเดเตเดเดฏเตเด เดเตเดฑเดฏเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต. เดชเตเดเตเดฏเด เดเตเดฑเดฏเตเดเตเดเดพเตป เดเดดเดฟเดฏเตเดจเตเดจเดฟเดฒเตเดฒเตเดเตเดเดฟเตฝ, เดเตเดณเดฟเดเดเต เดคเตเดฐเตเดกเต เดคเดเดเตเดเต. เดฎเดฑเตเดฑเตเดคเตเดเตเดเดฟเดฒเตเด เดธเดเตเดตเดฎเดพเดฏ เดคเตเดฐเตเดกเต/เดชเตเดฐเดเตเดฐเดฟเดฏ เดตเดดเดฟ เดธเดเดเตเดฏ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเดเตเดเตเดฎเตเดชเตเตพ, เดคเตเดฐเตเดกเตเดเตพ เดเดเดจเตเดจเตเดชเตเดเตเดเดฏเตเด เดธเตเดฎเดพเดซเตเตผ เดชเดพเดธเตเดธเดพเดฏ เดธเดเดเตเดฏเดฏเดพเตฝ เดตเตเดฃเตเดเตเด เดเตเดฑเดฏเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต. เดธเตเดฎเดพเดซเตเดฑเตเดณเตเดณ เดเดฐเต เดเตเดชเตเดชเดฟเดตเดณเดฏเดฟเตฝ เดเตเดฐเตเดฏเดฟเดจเตเดเดณเต เดจเดฟเดเตเดเตพเดเตเดเต เดธเดเตเดเตฝเดชเตเดชเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเตเด. เดธเดฎเดพเดจเดฎเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดทเดฎเดคเดฏเตเดณเตเดณ เดจเดฟเดฐเดตเดงเดฟ เดจเดฟเตผเดฎเตเดฎเดพเดฃเดเตเดเตพ .NET เดตเดพเดเตเดฆเดพเดจเด เดเตเดฏเตเดฏเตเดจเตเดจเต: AutoResetEvent
, ManualResetEvent
, Mutex
เดเดพเดจเตเด Semaphore
. เดเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเด AutoResetEvent
, เด เดจเดฟเตผเดฎเตเดฎเดพเดฃเดเตเดเดณเดฟเตฝ เดเดฑเตเดฑเดตเตเด เดฒเดณเดฟเดคเดฎเดพเดฏเดคเต เดเดคเดพเดฃเต: 0, 1 เดเดจเตเดจเต เดฐเดฃเตเดเต เดฎเตเดฒเตเดฏเดเตเดเตพ เดฎเดพเดคเตเดฐเด (เดคเตเดฑเตเดฑเตเด เดถเดฐเดฟเดฏเตเด). เด
เดตเดณเตเดเต เดฐเตเดคเดฟ WaitOne()
เดฎเตเดฒเตเดฏเด 0 เดเดฏเดฟเดฐเตเดจเตเดจเตเดเตเดเดฟเตฝ เดเตเดณเดฟเดเดเต เดคเตเดฐเตเดกเต เดคเดเดฏเตเดจเตเดจเต, 1 เดเดฃเตเดเตเดเดฟเตฝ, เด
เดคเดฟเดจเต 0 เดเดฏเดฟ เดคเดพเดดเตเดคเตเดคเดฟ เด
เดคเต เดเดดเดฟเดตเดพเดเตเดเตเดจเตเดจเต. เดเดฐเต เดฐเตเดคเดฟ Set()
1 เดเดฏเดฟ เดตเตผเดฆเตเดงเดฟเดเตเดเตเดเดฏเตเด เดเดฐเดพเดณเต เดเดเดจเตเดจเตเดชเตเดเดพเตป เด
เดจเตเดตเดฆเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต, เด
เดคเต เดตเตเดฃเตเดเตเด 0 เดเดฏเดฟ เดเตเดฑเดฏเตเดจเตเดจเต. เดธเดฌเตโเดตเตเดฏเดฟเตฝ เดเดฐเต เดเตเตบเดธเตเดฑเตเดฑเตเตฝ เดชเตเดฒเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต.
เดจเดฎเตเดเตเดเต เดชเดฐเดฟเดนเดพเดฐเด เดธเดเตเดเตเตผเดฃเตเดฃเดฎเดพเดเตเดเตเดเดฏเตเด เดเดฐเต เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดจเตเด เดคเดเดฏเตฝ เดเดชเดฏเตเดเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเดพเด, เด เดฒเตเดฒเดพเดคเต เดเดฑเตเดฑเดฏเดเดฟเดเตเดเต เด เดฒเตเดฒ. เด. เดเดชเตเดชเตเตพ เดจเดฟเดฐเดตเดงเดฟ เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตผเดเตเดเต เดเดฐเตเดธเดฎเดฏเด เดญเดเตเดทเดฃเด เดเดดเดฟเดเตเดเดพเด, เดเดจเตเดจเดฒเตเดฒ. เดเดจเตเดจเดพเตฝ เดฑเตเดธเต เดธเดพเดนเดเดฐเตเดฏเดเตเดเตพ เดเดดเดฟเดตเดพเดเตเดเดฟเดเตเดเตเดฃเตเดเต เดซเตเตผเดเตเดเตเดเตพ เดถเดฐเดฟเดฏเดพเดฏเดฟ เดเดเตเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดเดเตเดเตพ เดตเตเดฃเตเดเตเด เดชเดเตเดเดฟเดเดฏเดฟเดฒเตเดเตเดเตเดณเตเดณ เดเดเตเดธเดธเต เดคเดเดฏเตเดจเตเดจเต.
// ะะปั ะฑะปะพะบะธัะพะฒะฐะฝะธั ะพัะดะตะปัะฝะพะณะพ ัะธะปะพัะพัะฐ.
// ะะฝะธัะธะฐะปะธะทะธััะตััั: new AutoResetEvent(true) ะดะปั ะบะฐะถะดะพะณะพ.
private AutoResetEvent[] philosopherEvents;
// ะะปั ะดะพัััะฟะฐ ะบ ะฒะธะปะบะฐะผ / ะดะพัััะฟ ะบ ััะพะปั.
private AutoResetEvent tableEvent = new AutoResetEvent(true);
// ะ ะพะถะดะตะฝะธะต ัะธะปะพัะพัะฐ.
public void Run(int i, CancellationToken token)
{
while (true)
{
TakeForks(i); // ะะดะตั ะฒะธะปะบะธ.
// ะะฑะตะด. ะะพะถะตั ะฑััั ะธ ะดะพะปััะต.
eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1);
PutForks(i); // ะัะดะฐัั ะฒะธะปะบะธ ะธ ัะฐะทะฑะปะพะบะธัะพะฒะฐัั ัะพัะตะดะตะน.
Think(i);
if (token.IsCancellationRequested) break;
}
}
// ะะถะธะดะฐัั ะฒะธะปะบะธ ะฒ ะฑะปะพะบะธัะพะฒะบะต.
void TakeForks(int i)
{
bool hasForks = false;
while (!hasForks) // ะะพะฟัะพะฑะพะฒะฐัั ะตัะต ัะฐะท (ะฑะปะพะบะธัะพะฒะบะฐ ะฝะต ะทะดะตัั).
{
// ะัะบะปััะฐััะธะน ะดะพัััะฟ ะบ ััะพะปั, ะฑะตะท ะณะพะฝะพะบ ะทะฐ ะฒะธะปะบะฐะผะธ.
tableEvent.WaitOne();
if (forks[Left(i)] == 0 && forks[Right(i)] == 0)
forks[Left(i)] = forks[Right(i)] = i + 1;
hasForks = forks[Left(i)] == i + 1 && forks[Right(i)] == i + 1;
if (hasForks)
// ะขะตะฟะตัั ัะธะปะพัะพั ะฟะพะตัั, ะฒัะนะดะตั ะธะท ัะธะบะปะฐ. ะัะปะธ Set
// ะฒัะทะฒะฐะฝ ะดะฒะฐะถะดั, ัะพ ะทะฝะฐัะตะฝะธะต true.
philosopherEvents[i].Set();
// ะ ะฐะทะฑะปะพะบะธัะพะฒะฐัั ะพะดะฝะพะณะพ ะพะถะธะดะฐััะตะณะพ. ะะพัะปะต ะฝะตะณะพ ะทะฝะฐัะตะฝะธะต tableEvent ะฒ false.
tableEvent.Set();
// ะัะปะธ ะธะผะตะตั true, ะฝะต ะฑะปะพะบะธััะตััั, ะฐ ะตัะปะธ false, ัะพ ะฑัะดะตั ะถะดะฐัั Set ะพั ัะพัะตะดะฐ.
philosopherEvents[i].WaitOne();
}
}
// ะัะดะฐัั ะฒะธะปะบะธ ะธ ัะฐะทะฑะปะพะบะธัะพะฒะฐัั ัะพัะตะดะตะน.
void PutForks(int i)
{
tableEvent.WaitOne(); // ะะตะท ะณะพะฝะพะบ ะทะฐ ะฒะธะปะบะฐะผะธ.
forks[Left(i)] = 0;
// ะัะพะฑัะดะธัั ะปะตะฒะพะณะพ, ะฐ ะฟะพัะพะผ ะธ ะฟัะฐะฒะพะณะพ ัะพัะตะดะฐ, ะปะธะฑะพ AutoResetEvent ะฒ true.
philosopherEvents[LeftPhilosopher(i)].Set();
forks[Right(i)] = 0;
philosopherEvents[RightPhilosopher(i)].Set();
tableEvent.Set();
}
เดเดตเดฟเดเต เดเดจเตเดคเดพเดฃเต เดธเดเดญเดตเดฟเดเตเดเตเดจเตเดจเดคเตเดจเตเดจเต เดฎเดจเดธเดฟเดฒเดพเดเตเดเดพเตป, เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตป เดซเตเตผเดเตเดเตเดเตพ เดเดเตเดเตเดเตเดจเตเดจเดคเดฟเตฝ เดชเดฐเดพเดเดฏเดชเตเดชเตเดเตเดเดชเตเดชเตเตพ เดเตเดธเต เดชเดฐเดฟเดเดฃเดฟเดเตเดเตเด, เด
เดชเตเดชเตเตพ เด
เดตเตปเตเดฑเต เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดเตพ เดเดชเตเดฐเดเดพเดฐเดฎเดพเดฏเดฟเดฐเดฟเดเตเดเตเด. เด
เดตเตป เดฎเตเดถเดฏเดฟเดฒเตเดเตเดเตเดณเตเดณ เดชเตเดฐเดตเตเดถเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเดเดฏเดพเดฃเต. เด
เดคเต เดธเตเดตเตเดเดฐเดฟเดเตเดเต, เด
เดตเตป เดซเตเตผเดเตเดเตเดเตพ เดเดเตเดเตเดเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเตเดจเตเดจเต. เดตเตผเดเตเดเต เดเดเตเดเต เดเดฏเดฟเดฒเตเดฒ. เดเดคเต เดชเดเตเดเดฟเดเดฏเดฟเดฒเตเดเตเดเตเดณเตเดณ เดชเตเดฐเดตเตเดถเดจเด เดจเตฝเดเตเดจเตเดจเต (เดชเดฐเดธเตเดชเดฐ เดเดดเดฟเดตเดพเดเตเดเตฝ). เด
เดตเตป เดคเตปเตเดฑเต "เดเตเตบเดธเตเดฑเตเดฑเตเตฝ" เดเดเดจเตเดจเตเดชเตเดเตเดจเตเดจเต (AutoResetEvent
) (เดเดฆเตเดฏเด เด
เดตเตผ เดคเตเดฑเดจเตเดจเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต). เด
เดคเต เดตเตเดฃเตเดเตเด เดเดเตเดฐเดคเตเดคเดฟเตฝ เดตเตเดดเตเดจเตเดจเต, เดเดพเดฐเดฃเด เด
เดตเดจเต เดเดจเตเดคเดฟเดเตพ เดเดฒเตเดฒ. เด
เดตเตป เด
เดตเดฐเต เดเดเตเดเตเดเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเตเดเดฏเตเด เดคเตปเตเดฑเต "เดเตเตบเดธเตเดฑเตเดฑเตเดฒเดฟเตฝ" เดจเดฟเตผเดคเตเดคเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต. เดตเดฒเดคเตเดคเตเดเตเดเต เดเดเดคเตเดคเตเดเตเดเต เดญเดพเดเตเดฏเดตเดพเดจเดพเดฏ เดเดฟเดฒ เด
เดฏเตฝเดเตเดเดพเดฐเตป, เดญเดเตเดทเดฃเด เดเดดเดฟเดเตเดเตเดเดดเดฟเดเตเดเดพเตฝ, "เด
เดตเตปเตเดฑเต เดเตเตบเดธเตเดฑเตเดฑเตเตฝ เดคเตเดฑเดจเตเดจเต" เดจเดฎเตเดฎเตเดเต เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดจเต เดคเดเดเตเดเตเดจเดฟเตผเดคเตเดคเตเด. เดจเดฎเตเดฎเตเดเต เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตป เดฐเดฃเตเดเดพเดฎเดคเตเด เด
เดคเดฟเดฒเตเดเต เดเดเดจเตเดจเตเดชเตเดเตเดจเตเดจเต (เด
เดคเต เด
เดตเตปเตเดฑเต เดชเดฟเดจเตเดจเดฟเตฝ เด
เดเดฏเตเดเตเดเตเดจเตเดจเต). เดซเตเตผเดเตเดเตเดเตพ เดเดเตเดเตเดเดพเตป เดฎเตเดจเตเดจเดพเด เดคเดตเดฃ เดถเตเดฐเดฎเดฟเดเตเดเตเดจเตเดจเต. เดตเดฟเดเดฏเดฟเดเตเดเต. เดเดเตเดเดญเดเตเดทเดฃเด เดเดดเดฟเดเตเดเดพเตป เด
เดตเตป เดคเตปเตเดฑเต เดเตเตบเดธเตเดฑเตเดฑเตเดฒเดฟเดฒเตเดเต เดชเตเดเตเดจเตเดจเต.
เด
เดคเตเดคเดฐเด เดเตเดกเดฟเตฝ เดเตเดฐเดฎเดฐเดนเดฟเดคเดฎเดพเดฏ เดชเดฟเดถเดเตเดเตพ เดเดฃเตเดเดพเดเตเดฎเตเดชเตเตพ (เด
เดต เดเดฒเตเดฒเดพเดฏเตเดชเตเดชเตเดดเตเด เดจเดฟเดฒเดตเดฟเดฒเตเดฃเตเดเต), เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดเดฐเต เด
เดฏเตฝเดเตเดเดพเดฐเดจเต เดคเตเดฑเตเดฑเดพเดฏเดฟ เดตเตเดฏเดเตเดคเดฎเดพเดเตเดเตเด เด
เดฒเตเดฒเตเดเตเดเดฟเตฝ เด
เดคเต เดเดฌเตเดเดเตเดฑเตเดฑเต เดธเตเดทเตเดเดฟเดเตเดเดชเตเดชเตเดเตเด AutoResetEvent
เดเดฒเตเดฒเดพเดตเตผเดเตเดเตเด (Enumerable.Repeat
), เด
เดชเตเดชเตเตพ เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตผ เดกเตเดตเดฒเดชเตเดชเตผเดฎเดพเตผเดเตเดเดพเดฏเดฟ เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเด, เดเดพเดฐเดฃเด เด
เดคเตเดคเดฐเด เดเตเดกเตเดเดณเดฟเตฝ เดชเดฟเดถเดเตเดเตพ เดเดฃเตเดเตเดคเตเดคเตเดจเตเดจเดคเต เดตเดณเดฐเต เดฌเตเดฆเตเดงเดฟเดฎเตเดเตเดเตเดณเตเดณ เดเดพเดฐเตเดฏเดฎเดพเดฃเต. เด เดชเดฐเดฟเดนเดพเดฐเดคเตเดคเดฟเตปเตเดฑเต เดฎเดฑเตเดฑเตเดฐเต เดชเตเดฐเดถเตเดจเด, เดเดฟเดฒ เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตผ เดชเดเตเดเดฟเดฃเดฟ เดเดฟเดเดเตเดเดฟเดฒเตเดฒเตเดจเตเดจเต เดเดคเต เดเดฑเดชเตเดชเตเดจเตฝเดเตเดจเตเดจเดฟเดฒเตเดฒ เดเดจเตเดจเดคเดพเดฃเต.
เดนเตเดฌเตเดฐเดฟเดกเต เดชเดฐเดฟเดนเดพเดฐเดเตเดเตพ
เดเดเตเดเตพ เดเดชเดฏเตเดเตเดคเต เดฎเตเดกเดฟเตฝ เดคเตเดเดฐเตเดเดฏเตเด เดเดฐเต เดฒเตเดชเตเดชเดฟเตฝ เดเดฑเดเตเดเตเดเดฏเตเด เดเตเตผเดฃเดฒเดฟเดฒเตเดเต เดคเตเดฐเตเดกเต เดคเดเดฏเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดฎเตเดชเตเตพ, เดธเดฎเดจเตเดตเดฏเดคเตเดคเดฟเดจเตเดณเตเดณ เดฐเดฃเตเดเต เดธเดฎเตเดชเดจเดเตเดเตพ เดเดเตเดเตพ เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเต. เดเดฆเตเดฏ เดฐเตเดคเดฟ เดเตเดฑเดฟเดฏ เดฌเตเดฒเตเดเตเดเตเดเตพเดเตเดเต เดจเดฒเตเดฒเดคเดพเดฃเต, เดฐเดฃเตเดเดพเดฎเดคเตเดคเตเดคเต เดจเตเดณเดฎเตเดณเตเดณเดตเดฏเตเดเตเดเต. เดเดฐเต เดฒเตเดชเตเดชเดฟเตฝ เดเดฐเต เดตเตเดฐเดฟเดฏเดฌเดฟเตพ เดฎเดพเดฑเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เดจเดฟเดเตเดเตพ เดเดฆเตเดฏเด เดนเตเดฐเดธเตเดตเดฎเดพเดฏเดฟ เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต, เดคเตเดเตผเดจเตเดจเต เดเดพเดคเตเดคเดฟเดฐเดฟเดชเตเดชเต เดฆเตเตผเดเดฎเดพเดเตเดฎเตเดชเตเตพ เดคเตเดฐเตเดกเต เดคเดเดฏเตเด. เดตเดฟเดณเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจเดตเดฏเดฟเตฝ เด เดธเดฎเตเดชเดจเด เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเต. เดนเตเดฌเตเดฐเดฟเดกเต เดกเดฟเดธเตเดจเตเดเตพ. เดเดคเดฟเดจเต เดเตเตผเดฃเตฝ เดฎเตเดกเดฟเตปเตเดฑเต เด
เดคเต เดจเดฟเตผเดฎเตเดฎเดฟเดคเดฟเดเดณเตเดฃเตเดเต, เดเดจเตเดจเดพเตฝ เดเดชเตเดชเตเตพ เดเดฐเต เดเดชเดฏเตเดเตเดคเต เดฎเตเดกเต เดฒเตเดชเตเดชเดฟเดจเตเดชเตเดชเด: SemaphorSlim
, ManualResetEventSlim
เดฎเตเดคเดฒเดพเดฏเดต. เดเดตเดฟเดเต เดเดฑเตเดฑเดตเตเด เดชเตเดฐเดถเดธเตเดคเดฎเดพเดฏ เดกเดฟเดธเตเตป เดเดฃเต Monitor
, เดเดพเดฐเดฃเด C#-เตฝ เด
เดฑเดฟเดฏเดชเตเดชเตเดเตเดจเตเดจ เดเดจเตเดจเต เดเดฃเตเดเต lock
เดตเดพเดเตเดฏเดเดเดจ. Monitor
เดชเดฐเดฎเดพเดตเดงเดฟ เดฎเตเดฒเตเดฏเด 1 (เดฎเตเดฏเตเดเตเดเดเตเดธเต) เดเดณเตเดณ เด
เดคเต เดธเตเดฎเดพเดซเตเตผ เดเดฃเต, เดเดจเตเดจเดพเตฝ เดเดฐเต เดฒเตเดชเตเดชเดฟเตฝ เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเดฟเดจเตเดคเตเดฃ, เดเดตเตผเดคเตเดคเดจเด, เดเดฃเตเดเตเดทเตป เดตเตเดฐเดฟเดฏเดฌเดฟเตพ เดชเดพเดฑเตเดฑเตเตบ (เดคเดพเดดเตเดฏเตเดณเตเดณเดคเดฟเตฝ เดเตเดเตเดคเตฝ) เดฎเตเดคเดฒเดพเดฏเดต. เด
เดคเดฟเดจเตเดณเตเดณ เดเดฐเต เดชเดฐเดฟเดนเดพเดฐเด เดจเตเดเตเดเดพเด.
// ะกะฟัััะตะผ ะพะฑัะตะบั ะดะปั ะะพะฝะธัะพัะฐ ะพั ะฒัะตั
, ััะพะฑั ะฑะตะท ะดะตะดะปะพะบะพะฒ.
private readonly object _lock = new object();
// ะัะตะผั ะพะถะธะดะฐะฝะธั ะฟะพัะพะบะฐ.
private DateTime?[] _waitTimes = new DateTime?[philosophersAmount];
public void Run(int i, CancellationToken token)
{
while (true)
{
TakeForks(i);
eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1);
PutForks(i);
Think(i);
if (token.IsCancellationRequested) break;
}
}
// ะะฐัะต ัะปะพะถะฝะพะต ััะปะพะฒะธะต ะดะปั Condition Variable ะฟะฐััะตัะฝะฐ.
bool CanIEat(int i)
{
// ะัะปะธ ะตััั ะฒะธะปะบะธ:
if (forks[Left(i)] != 0 && forks[Right(i)] != 0)
return false;
var now = DateTime.Now;
// ะะพะถะตั, ะตัะปะธ ัะพัะตะดะธ ะฝะต ะฑะพะปะตะต ะณะพะปะพะดะฝัะต, ัะตะผ ัะตะบััะธะน.
foreach(var p in new int[] {LeftPhilosopher(i), RightPhilosopher(i)})
if (_waitTimes[p] != null && now - _waitTimes[p] > now - _waitTimes[i])
return false;
return true;
}
void TakeForks(int i)
{
// ะะฐะนัะธ ะฒ ะะพะฝะธัะพั. ะขะพ ะถะต ัะฐะผะพะต: lock(_lock) {..}.
// ะัะทัะฒะฐะตะผ ะฒะฝะต try, ััะพะฑั ะฒะพะทะผะพะถะฝะพะต ะธัะบะปััะตะฝะธะต ะฒัะฑัะฐััะฒะฐะปะพัั ะฒััะต.
bool lockTaken = false;
Monitor.Enter(_lock, ref lockTaken);
try
{
_waitTimes[i] = DateTime.Now;
// Condition Variable ะฟะฐััะตัะฝ. ะัะฒะพะฑะพะถะดะฐะตะผ ะปะพะบ, ะตัะปะธ ะฝะต ะฒัะฟะพะปะฝะตะฝะฝะพ
// ัะปะพะถะฝะพะต ััะปะพะฒะธะต. ะ ะถะดะตะผ ะฟะพะบะฐ ะบัะพ-ะฝะธะฑัะดั ัะดะตะปะฐะตั Pulse / PulseAll.
while (!CanIEat(i))
Monitor.Wait(_lock);
forks[Left(i)] = i + 1;
forks[Right(i)] = i + 1;
_waitTimes[i] = null;
}
finally
{
if (lockTaken) Monitor.Exit(_lock);
}
}
void PutForks(int i)
{
// ะขะพ ะถะต ัะฐะผะพะต: lock (_lock) {..}.
bool lockTaken = false;
Monitor.Enter(_lock, ref lockTaken);
try
{
forks[Left(i)] = 0;
forks[Right(i)] = 0;
// ะัะฒะพะฑะพะดะธัั ะฒัะต ะฟะพัะพะบะธ ะฒ ะพัะตัะตะดะธ ะะะกะะ ะฒัะทะพะฒะฐ Monitor.Exit.
Monitor.PulseAll(_lock);
}
finally
{
if (lockTaken) Monitor.Exit(_lock);
}
}
เดเดตเดฟเดเต เดเดเตเดเตพ เดตเตเดฃเตเดเตเด เดฎเตเดดเตเดตเตป เดเตเดฌเดฟเดณเตเด เดซเตเตผเดเตเดเตเดเตพ เดเดเตโเดธเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดคเดเดฏเตเดจเตเดจเต, เดเดจเตเดจเดพเตฝ เดเดชเตเดชเตเตพ เดเดเตเดเตพ เดเดฒเตเดฒเดพ เดคเตเดฐเตเดกเตเดเดณเตเด เดเดฐเตเดธเดฎเดฏเด เด เตบเดฌเตเดฒเตเดเตเดเต เดเตเดฏเตเดฏเตเดจเตเดจเต, เดเดฐเตเดเตเดเดฟเดฒเตเด เดญเดเตเดทเดฃเด เดเดดเดฟเดเตเดเต เดเดดเดฟเดฏเตเดฎเตเดชเตเตพ เด เดฏเตฝเดเตเดเดพเดฐเตเดเตเดเดพเตพ. เด. เดเดฆเตเดฏเด, เดเดฐเตเดเตเดเดฟเดฒเตเด เดญเดเตเดทเดฃเด เดเดดเดฟเดเตเดเตเดเดฏเตเด เด เดฏเตฝเดเตเดเดพเดฐเต เดคเดเดฏเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต, เดเดฐเตเดเตเดเดฟเดฒเตเด เดเดคเต เดชเตเตผเดคเตเดคเดฟเดฏเดพเดเตเดเตเดฎเตเดชเตเตพ, เดชเดเตเดทเต เดเดเตป เดคเดจเตเดจเต เดตเตเดฃเตเดเตเด เดเดดเดฟเดเตเดเดพเตป เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจเต, เด เดตเตป เดฌเตเดฒเตเดเตเดเดฟเดฒเตเดเตเดเต เดชเตเดฏเดฟ เด เดฏเตฝเดเตเดเดพเดฐเต เดเดฃเตผเดคเตเดคเตเดจเตเดจเต, เดเดพเดฐเดฃเด เด เดคเดฟเตปเตเดฑเต เดเดพเดคเตเดคเดฟเดฐเดฟเดชเตเดชเต เดธเดฎเดฏเด เดเตเดฑเดตเดพเดฃเต.
เดเดคเตเดตเดดเดฟ เดเดฟเดฒ เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเตเดเต เดชเดเตเดเดฟเดฃเดฟเดฏเตเด เดชเตเดฐเดคเดฟเดธเดจเตเดงเดฟเดเดณเตเด เดเดดเดฟเดตเดพเดเตเดเตเดจเตเดจเต. เดเดฐเต เดเตเดฑเดฟเดฏ เดธเดฎเดฏเด เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเดพเดจเตเด เดฆเตเตผเดเดจเตเดฐเด เดคเตเดฐเตเดกเต เดคเดเดฏเดพเดจเตเด เดเดเตเดเตพ เดเดฐเต เดฒเตเดชเตเดชเต เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต. เดเดฒเตเดฒเดพเดตเดฐเตเดฏเตเด เดเดฐเตเดธเดฎเดฏเด เด
เตบเดฌเตเดฒเตเดเตเดเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเต เด
เดฏเตฝเดเตเดเดพเดฐเดจเต เดฎเดพเดคเตเดฐเด เด
เตบเดฒเตเดเตเดเต เดเตเดฏเตเดคเดคเดฟเดจเตเดเตเดเดพเตพ เดตเตเดเดค เดเตเดฑเดตเดพเดฃเต, เดชเดฐเดฟเดนเดพเดฐเดคเตเดคเดฟเดฒเตเดจเตเดจเดชเตเดฒเต AutoResetEvent
, เดเดจเตเดจเดพเตฝ เดตเตเดฏเดคเตเดฏเดพเดธเด เดตเดฒเตเดคเดพเดฏเดฟเดฐเดฟเดเตเดเดฐเตเดคเต, เดเดพเดฐเดฃเด เดคเตเดฐเตเดกเตเดเตพ เดเดฆเตเดฏเด เดเดชเดฏเตเดเตเดคเต เดฎเตเดกเดฟเตฝ เดจเดฟเดฒเดจเดฟเตฝเดเตเดเดฃเด.
ะฃ lock
เดตเดพเดเตเดฏเดเดเดจเดฏเดฟเตฝ เดเดฟเดฒ เด
เดธเตเดเดเดฐเดฎเดพเดฏ เดเดถเตเดเดฐเตเดฏเดเตเดเดณเตเดฃเตเดเต. เดเดชเดฏเตเดเดฟเดเตเดเดพเตป เดถเตเดชเดพเตผเดถ เดเตเดฏเตเดฏเตเดจเตเดจเต Monitor
เดจเตเดฐเดฟเดเตเดเต [เดฑเดฟเดเตเดเตผ] [เดเดฑเดฟเดเต เดฒเดฟเดชเตเดชเตผเดเตเดเต]. เด
เดคเดฟเดฒเตเดจเตเดจเดพเดฃเต เด
เดคเต lock
เดเดชเตเดชเตเดดเตเด เดชเตเดฑเดคเตเดคเตเดตเดฐเตเดจเตเดจเต Monitor
, เดเดฐเต เด
เดชเดตเดพเดฆเด เดเดฃเตเดเดพเดฏเดพเดฒเตเด, เดฎเดฑเตเดฑเตเดฐเต เดคเตเดฐเตเดกเดฟเดจเต เดชเดเตเดเดฟเดเตเด เดฎเตเดฎเตเดฎเดฑเดฟเดฏเตเดเต เด
เดตเดธเตเดฅ เดฎเดพเดฑเตเดฑเดพเตป เดเดดเดฟเดฏเตเด. เด
เดคเตเดคเดฐเด เดธเดจเตเดฆเตผเดญเดเตเดเดณเดฟเตฝ, เดเดฐเต เดธเตเดคเดเดญเดจเดพเดตเดธเตเดฅเดฏเดฟเดฒเตเดเตเดเต เดชเตเดเตเดเดฏเต เดเดเตเดเดจเตเดฏเตเดเตเดเดฟเดฒเตเด เดธเตเดฐเดเตเดทเดฟเดคเดฎเดพเดฏเดฟ เดชเตเดฐเตเดเตเดฐเดพเด เด
เดตเดธเดพเดจเดฟเดชเตเดชเดฟเดเตเดเตเดเดฏเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดพเดฃเต เดจเดฒเตเดฒเดคเต. เดฎเตเดฃเดฟเดฑเตเดฑเตผ เดเตเดฒเตเดเตเดเต เดฌเตเดฒเตเดเตเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต เดเดจเตเดจเดคเดพเดฃเต เดฎเดฑเตเดฑเตเดฐเต เดเดถเตเดเดฐเตเดฏเด (SyncBlock
), เดเดฒเตเดฒเดพ เดตเดธเตเดคเตเดเตเดเดณเดฟเดฒเตเด เดเดฃเตเดเต. เด
เดคเดฟเดจเดพเตฝ, เด
เดจเตเดเดฟเดคเดฎเดพเดฏ เดเดฐเต เดเดฌเตโเดเดเตเดฑเตเดฑเต เดคเดฟเดฐเดเตเดเตเดเตเดคเตเดคเดฟเดเตเดเตเดฃเตเดเตเดเตเดเดฟเตฝ, เดจเดฟเดเตเดเตพเดเตเดเต เดเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดเดฐเต เดกเตเดกเตโเดฒเตเดเตเดเต เดฒเดญเดฟเดเตเดเตเด (เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดจเดฟเดเตเดเตพ เดเดฐเต เดเตปเตเดฑเตเตบเดกเต เดธเตเดเตเดฐเดฟเดเดเดฟเตฝ เดฒเตเดเตเดเต เดเตเดฏเตเดฏเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ). เดเดคเดฟเดจเดพเดฏเดฟ เดจเดฎเตเดฎเตพ เดเดชเตเดชเตเดดเตเด เดเดฐเต เดฎเดฑเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจ เดตเดธเตเดคเตเดตเดพเดฃเต เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเต.
เดเดฟเดฒ เดธเดเตเดเตเตผเดฃเตเดฃเดฎเดพเดฏ เด เดตเดธเตเดฅเดฏเตเดเต เดชเตเดฐเดคเตเดเตเดทเดเตพ เดเตเดเตเดคเตฝ เดธเดเดเตเดทเดฟเดชเตเดคเดฎเดพเดฏเดฟ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดพเตป เดเดฃเตเดเตเดทเตป เดตเตเดฐเดฟเดฏเดฌเดฟเตพ เดชเดพเดฑเตเดฑเตเตบ เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต. .NET-เตฝ เดเดคเต เด เดชเตเตผเดฃเตเดฃเดฎเดพเดฃเต, เดเตปเตเดฑเต เด เดญเดฟเดชเตเดฐเดพเดฏเดคเตเดคเดฟเตฝ, เดเดพเดฐเดฃเด... เดธเดฟเดฆเตเดงเดพเดจเตเดคเดคเตเดคเดฟเตฝ, เดจเดฟเดฐเดตเดงเดฟ เดตเตเดฐเดฟเดฏเดฌเดฟเดณเตเดเดณเดฟเตฝ (เดชเตเดธเดฟเดเตเดธเต เดคเตเดฐเตเดกเตเดเดณเดฟเดฒเตเดคเตเดชเตเดฒเต) เดจเดฟเดฐเดตเดงเดฟ เดเตเดฏเตเดเตพ เดเดฃเตเดเดพเดฏเดฟเดฐเดฟเดเตเดเดฃเด, เดเดฐเต เดฒเตเดเตเดเดฟเดฒเดฒเตเดฒ. เด เดชเตเดชเตเตพ เดเดฒเตเดฒเดพ เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตผเดเตเดเตเด เดตเตเดฃเตเดเดฟ เด เดต เดเดฃเตเดเดพเดเตเดเดพเตป เดธเดพเดงเดฟเดเตเดเตเด. เดเดจเตเดจเดพเตฝ เด เดฐเตเดชเดคเตเดคเดฟเตฝ เดชเตเดฒเตเด เดเตเดกเต เดเตเดฑเตเดคเดพเดเตเดเดพเตป เดเดคเต เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต.
เดจเดฟเดฐเดตเดงเดฟ เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตผ เด
เดฒเตเดฒเตเดเตเดเดฟเตฝ async
/ await
เดถเดฐเดฟ, เดเดชเตเดชเตเตพ เดจเดฎเตเดเตเดเต เดคเตเดฐเตเดกเตเดเตพ เดซเดฒเดชเตเดฐเดฆเดฎเดพเดฏเดฟ เดคเดเดฏเดพเด. เดเดจเตเดจเดพเตฝ เดจเดฎเตเดเตเดเต เดงเดพเดฐเดพเดณเด เดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเตผ เดเดฃเตเดเตเดเตเดเดฟเตฝ เดเดจเตเดคเตเดเตเดฏเตเดฏเตเด? 100? 10000? เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดตเตเดฌเต เดธเตเตผเดตเดฑเดฟเดฒเตเดเตเดเต เดเดเตเดเตพเดเตเดเต 100000 เด เดญเตเดฏเตผเดคเตเดฅเดจเดเตพ เดฒเดญเดฟเดเตเดเต. เดเดฐเต เด เดญเตเดฏเตผเดคเตเดฅเดจเดฏเตเดเตเดเตเด เดเดฐเต เดคเตเดฐเตเดกเต เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเต เดเตเดฒเดตเตเดฑเดฟเดฏเดคเดพเดฏเดฟเดฐเดฟเดเตเดเตเด, เดเดพเดฐเดฃเด เดจเดฟเดฐเดตเดงเดฟ เดคเตเดฐเตเดกเตเดเตพ เดธเดฎเดพเดจเตเดคเดฐเดฎเดพเดฏเดฟ เดเดเตเดธเดฟเดเตเดฏเตเดเตเดเต เดเตเดฏเตเดฏเดฟเดฒเตเดฒ. เดเดคเตเดฐ เดฒเตเดเดฟเดเตเดเตฝ เดเตเดฑเตเดเตพ เดฎเดพเดคเตเดฐเดฎเต เดเดเตเดธเดฟเดเตเดฏเตเดเตเดเต เดเตเดฏเตเดฏเต (เดเดจเดฟเดเตเดเต 4 เดเดฃเตเดเต). เดฎเดฑเตเดฑเตเดฒเตเดฒเดพเดตเดฐเตเด เดตเดฟเดญเดตเดเตเดเตพ เดเดเตเดคเตเดคเตเดเดณเดฏเตเด. เด เดชเตเดฐเดถเตเดจเดคเตเดคเดฟเดจเตเดณเตเดณ เดเดฐเต เดชเดฐเดฟเดนเดพเดฐเดฎเดพเดฃเต เด เดธเดฟเตปเดเต / เดตเตเดฏเดฟเดฑเตเดฑเต เดชเดพเดฑเตเดฑเตเตบ. เดเดจเตเดคเตเดเตเดเดฟเดฒเตเด เดคเตเดเดฐเดพเตป เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเดฃเดฎเตเดเตเดเดฟเตฝ เดเดฐเต เดซเดเดเตโเดทเตป เดเดฐเต เดคเตเดฐเตเดกเต เดเตเดตเดถเด เดตเดฏเตเดเตเดเดฟเดฒเตเดฒ เดเดจเตเดจเดคเดพเดฃเต เด เดคเดฟเตปเตเดฑเต เดเดถเดฏเด. เดเดจเตเดคเตเดเตเดเดฟเดฒเตเด เดธเดเดญเดตเดฟเดเตเดเตเดฎเตเดชเตเตพ, เด เดคเต เด เดคเดฟเตปเตเดฑเต เดจเดฟเตผเดตเตเดตเดนเดฃเด เดชเตเดจเดฐเดพเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเต (เดเดจเตเดจเดพเตฝ เด เดคเต เดคเตเดฐเตเดกเดฟเตฝ เดเดฏเดฟเดฐเดฟเดเตเดเดฃเดฎเตเดจเตเดจเดฟเดฒเตเดฒ!). เดเดเตเดเดณเตเดเต เดเดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดเดเตเดเตพ เดเดฐเต เดจเดพเตฝเดเตเดเดตเดฒเดฏเตเดเตเดเดพเดฏเดฟ เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเด.
SemaphoreSlim
เดเดคเดฟเดจเดพเดฏเดฟ เดเดฃเตเดเต WaitAsync()
เดฐเตเดคเดฟ. เด เดชเดพเดฑเตเดฑเตเตบ เดเดชเดฏเตเดเดฟเดเตเดเตเดณเตเดณ เดเดฐเต เดจเดเดชเตเดชเดพเดเตเดเตฝ เดเดคเดพ.
// ะะฐะฟััะบ ัะฐะบะพะน ะถะต, ะบะฐะบ ัะฐะฝััะต. ะะดะต-ะฝะธะฑัะดั ะฒ ะฟัะพะณัะฐะผะผะต:
Task.Run(() => Run(i, cancelTokenSource.Token));
// ะะฐะฟััะบ ัะธะปะพัะพัะฐ.
// ะะปััะตะฒะพะต ัะปะพะฒะพ async -- ะบะพะผะฟะธะปััะพั ััะฐะฝัะปะธััะตั ััะพั ะผะตัะพั ะฒ ะฐัะธะฝั
ัะพะฝะฝัะน.
public async Task Run(int i, CancellationToken token)
{
while (true)
{
// await -- ะฑัะดะตะผ ะพะถะธะดะฐัั ะบะฐะบะพะณะพ-ัะพ ัะพะฑััะธั.
await TakeForks(i);
// ะะพัะปะต await, ะฟัะพะดะพะปะถะตะฝะธะต ะฒะพะทะผะพะถะฝะพ ะฒ ะดััะณะพะผ ะฟะพัะพะบะต.
eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1);
// ะะพะถะตั ะฑััั ะฝะตัะบะพะปัะบะพ ัะพะฑััะธะน ะดะปั ะพะถะธะดะฐะฝะธั.
await PutForks(i);
Think(i);
if (token.IsCancellationRequested) break;
}
}
async Task TakeForks(int i)
{
bool hasForks = false;
while (!hasForks)
{
// ะะทะฐะธะผะพะธัะบะปััะฐััะธะน ะดะพัััะฟ ะบ ััะพะปั:
await _tableSemaphore.WaitAsync();
if (forks[Left(i)] == 0 && forks[Right(i)] == 0)
{
forks[Left(i)] = i+1;
forks[Right(i)] = i+1;
hasForks = true;
}
_tableSemaphore.Release();
// ะัะดะตะผ ะพะถะธะดะฐัั, ััะพะฑั ัะพัะตะด ะฟะพะปะพะถะธะป ะฒะธะปะบะธ:
if (!hasForks)
await _philosopherSemaphores[i].WaitAsync();
}
}
// ะะดะตะผ ะดะพัััะฟะฐ ะบ ััะพะปั ะธ ะบะปะฐะดะตะผ ะฒะธะปะบะธ.
async Task PutForks(int i)
{
await _tableSemaphore.WaitAsync();
forks[Left(i)] = 0;
// "ะัะพะฑัะดะธัั" ัะพัะตะดะตะน, ะตัะปะธ ะพะฝะธ "ัะฟะฐะปะธ".
_philosopherSemaphores[LeftPhilosopher(i)].Release();
forks[Right(i)] = 0;
_philosopherSemaphores[RightPhilosopher(i)].Release();
_tableSemaphore.Release();
}
เดเตเดเต เดฐเตเดคเดฟ async
/ await
เดเดฐเต เดคเดจเตเดคเตเดฐเดถเดพเดฒเดฟเดฏเดพเดฏ เดซเดฟเดจเดฟเดฑเตเดฑเต เดธเตเดฑเตเดฑเตเดฑเตเดฑเต เดฎเตเดทเตเดจเดพเดฏเดฟ เดตเดฟเดตเตผเดคเตเดคเดจเด เดเตเดฏเตเดฏเดชเตเดชเตเดเตเดจเตเดจเต, เด
เดคเต เดเดเดจเดเดฟ เด
เดคเดฟเตปเตเดฑเต เดเดจเตเดคเดฐเดฟเดเด เดคเดฟเดฐเดฟเดเต เดจเตฝเดเตเดจเตเดจเต Task
. เด
เดคเดฟเดฒเตเดเต, เดฐเตเดคเดฟ เดชเตเตผเดคเตเดคเดฟเดฏเดพเดเตเดจเตเดจเดคเตเดตเดฐเต เดจเดฟเดเตเดเตพเดเตเดเต เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเดพเด, เด
เดคเต เดฑเดฆเตเดฆเดพเดเตเดเดพเด, เดเตเดเดพเดคเต เดเดพเดธเตเดเต เดเดชเดฏเตเดเดฟเดเตเดเต เดจเดฟเดเตเดเตพเดเตเดเต เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเตเดจเตเดจ เดฎเดฑเตเดฑเตเดฒเตเดฒเดพเด. เดฐเตเดคเดฟเดเตเดเตเดณเตเดณเดฟเตฝ, เดเดฐเต เดธเตเดฑเตเดฑเตเดฑเตเดฑเต เดฎเตเดทเตเตป เดจเดฟเตผเดตเตเดตเดนเดฃเด เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดเตเดเตเดจเตเดจเต. เดเดพเดฒเดคเดพเดฎเดธเดฎเดฟเดฒเตเดฒเตเดเตเดเดฟเตฝ, เดจเดฟเตผเดตเตเดตเดนเดฃเด เดธเดฎเดจเตเดตเดฏเดฎเดพเดฃเต, เดเดฃเตเดเตเดเตเดเดฟเตฝ, เดคเตเดฐเตเดกเต เดฑเดฟเดฒเตเดธเต เดเตเดฏเตเดฏเดชเตเดชเตเดเตเด เดเดจเตเดจเดคเดพเดฃเต เดชเตเดฐเดงเดพเดจ เดเดพเดฐเตเดฏเด. เดเดคเต เดจเดจเตเดจเดพเดฏเดฟ เดฎเดจเดธเตเดธเดฟเดฒเดพเดเตเดเดพเตป, เด เดธเดเดธเตเดฅเดพเดจ เดฏเดจเตเดคเตเดฐเด เดจเตเดเตเดเตเดจเตเดจเดคเดพเดฃเต เดจเดฒเตเดฒเดคเต. เดเดตเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเดเตเดเตพเดเตเดเต เดเดเตเดเดฒเดเตพ เดเดฃเตเดเดพเดเตเดเดพเด async
/ await
เดฐเตเดคเดฟเดเตพ.
เดจเดฎเตเดเตเดเต เด เดคเต เดชเดฐเตเดเตเดทเดฟเดเตเดเดพเด. 100 เดฒเตเดเดฟเดเตเดเตฝ เดเตเดฑเตเดเดณเตเดณเตเดณ เดเดฐเต เดฎเตเดทเตเดจเดฟเตฝ 4 โโเดคเดคเตเดคเตเดตเดเดฟเดจเตเดคเดเดฐเตเดเต เดเตเดฒเดฟ, 8 เดธเตเดเตเดเตปเดกเต. เดฎเตเดฃเดฟเดฑเตเดฑเดฑเตเดฎเดพเดฏเตเดณเตเดณ เดฎเตเตป เดธเตเดฒเตเดฏเตเดทเตป เดเดฆเตเดฏเดคเตเดคเต 4 เดคเตเดฐเตเดกเตเดเตพ เดฎเดพเดคเตเดฐเดฎเต เดเดเตโเดธเดฟเดเตเดฏเตเดเตเดเต เดเตเดฏเตโเดคเตเดณเตเดณเต, เดฌเดพเดเตเดเดฟเดฏเตเดณเตเดณเดต เดเดเตโเดธเดฟเดเตเดฏเตเดเตเดเต เดเตเดฏเตโเดคเดฟเดฒเตเดฒ. เด 4 เดคเตเดฐเตเดกเตเดเดณเดฟเตฝ เดเดฐเตเดจเตเดจเตเด เดเดเดฆเตเดถเด 2 เดฎเดฟ. เดเตเดเดพเดคเต, เด เดธเดฟเตปเดเต / เดตเตเดฏเดฟเดฑเตเดฑเต เดธเตเดฒเตเดฏเตเดทเตป 100 เดเดฒเตเดฒเดพเด เดเตเดฏเตเดคเต, เดถเดฐเดพเดถเดฐเดฟ 6.8 เดธเตเดเตเดเตปเดกเต เดเดฐเต เดเดพเดคเตเดคเดฟเดฐเดฟเดชเตเดชเตเด. เดคเตเตผเดเตเดเดฏเดพเดฏเตเด, เดฏเดฅเดพเตผเดคเตเดฅ เดธเดฟเดธเตเดฑเตเดฑเดเตเดเดณเดฟเตฝ, 6 เดธเตเดเตเดเตปเดกเต เดจเดฟเดทเตโเดเตเดฐเดฟเดฏเดฎเดพเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเต เด เดธเตเดตเตเดเดพเดฐเตเดฏเดฎเดพเดฃเต, เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ เดเดคเตเดฐเดฏเตเด เด เดญเตเดฏเตผเดคเตเดฅเดจเดเตพ เด เดฐเตเดคเดฟเดฏเดฟเตฝ เดชเตเดฐเตเดธเดธเตเดธเต เดเตเดฏเตเดฏเดพเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเดพเดฃเต เดจเดฒเตเดฒเดคเต. เดฎเตเดฃเดฟเดฑเตเดฑเดฑเตเดฎเดพเดฏเตเดณเตเดณ เดชเดฐเดฟเดนเดพเดฐเด เดธเตเดเตเดฏเดฟเดฒเดฌเดฟเตพ เด เดฒเตเดฒเตเดจเตเดจเต เดคเตเดณเดฟเดเตเดเต.
เดคเตเดฐเตเดฎเดพเดจเด
เด เดเตเดฑเดฟเดฏ เดเดฆเดพเดนเดฐเดฃเดเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเดเตเดเตพเดเตเดเต เดเดพเดฃเดพเดจเดพเดเตเดจเตเดจเดคเตเดชเตเดฒเต, .NET เดจเดฟเดฐเดตเดงเดฟ เดธเดฟเตปเดเตเดฐเตเดฃเตเดธเตเดทเตป เดจเดฟเตผเดฎเตเดฎเดพเดฃเดเตเดเดณเต เดชเดฟเดจเตเดคเตเดฃเดฏเตเดเตเดเตเดจเตเดจเต. เดเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด, เด เดต เดเดเตเดเดจเต เดเดชเดฏเตเดเดฟเดเตเดเดฃเดฎเตเดจเตเดจเต เดเดฒเตเดฒเดพเดฏเตเดชเตเดชเตเดดเตเด เดตเตเดฏเดเตเดคเดฎเดฒเตเดฒ. เด เดฒเตเดเดจเด เดธเดนเดพเดฏเดเดฐเดฎเดพเดฃเตเดจเตเดจเต เดเดพเตป เดชเตเดฐเดคเตเดเตเดทเดฟเดเตเดเตเดจเตเดจเต. เดเดเตเดเตพ เดเดคเต เดเดชเตเดชเตเตพ เดชเตเดคเดฟเดฏเตเดเดฏเดพเดฃเต, เดเดจเตเดจเดพเตฝ เดเดจเดฟเดฏเตเด เดฐเดธเดเดฐเดฎเดพเดฏ เดเดฐเตเดชเดพเดเต เดเดพเดฐเตเดฏเดเตเดเตพ เดฌเดพเดเตเดเดฟเดฏเตเดฃเตเดเต, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดคเตเดฐเตเดกเต-เดธเตเดซเต เดเดณเดเตเดทเดจเตเดเตพ, TPL เดกเดพเดฑเตเดฑเดซเตเดฒเต, เดฑเดฟเดฏเดพเดเตเดเตเดตเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดเดเต, เดธเตเดซเตเดฑเตเดฑเตโเดตเตเดฏเตผ เดเดเดชเดพเดเต เดฎเตเดกเตฝ เดฎเตเดคเดฒเดพเดฏเดต.
เดเดฑเดตเดฟเดเดเตเดเตพ
- เดซเตเดฒเต เดฆเตเดถเตเดฏเดตเตฝเดเตเดเดฐเดฃเด:
เดเตบเดเดฑเตปเดธเดฟ เดตเดฟเดทเตเดตเดฒเตเดธเตผ - MSDN:
เดคเตเดฐเตเดกเดฟเดเดเต ,เด เดธเดฟเตปเดเตเดฐเดฃเดธเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดเดเต เดชเดพเดฑเตเดฑเตเดฃเตเดเตพ เดเดพเตป mn. เดกเต. - [เดฑเดฟเดเตเดเตผ] โ CLR เดตเดดเดฟ C#, เดเตเดซเตเดฐเดฟ เดฑเดฟเดเตเดเตผ
- [เดเดฑเดฟเดเต เดฒเดฟเดชเตเดชเตผเดเตเดเต] -
เดฒเตเดเตเดเดฟเดจเต เดเตเดฑเดฟเดเตเดเต เดเดฑเดตเดฟเด เดเตเดกเต - เดเดฟเดคเตเดฐเด - "เดตเดพเดณเตเดเตพเดเตเดเดฟเดเดฏเดฟเตฝ เดจเตเดคเตเดคเด", เดเดฟ เดธเตเดฎเดฟเดฑเดพเดกเตเดธเตเดเดฟ
เด เดตเดฒเดเดฌเด: www.habr.com