เปเบซเปเบเบงเบเปเบฎเบปเบฒเปเบเบดเปเบเบงเบดเบเบตเบเบฒเบเบเปเบฒเปเบเบตเบเปเบเบเบเบฒเบเบเปเบญเบกเบเบฑเบเปเบฅเบฐเบเบฐเบซเบเบฒเบเปเบ .Net, เบเบฒเบเบเปเบฒเปเบเปเบเบฑเบเบซเบฒเบญเบฒเบซเบฒเบเบเบญเบ Philosophers เปเบเบฑเบเบเบปเบงเบขเปเบฒเบ. เปเบเบเบเบฒเบเปเบกเปเบเบเบตเป, เบเบฒเบ synchronization เบเบญเบเบเบฐเบเบนเป / เบเบฐเบเบงเบเบเบฒเบ, เบเบฑเบเบเบปเบงเปเบเบเบเบฑเบเบชเบฐเปเบเบ (เปเบเบเบฒเบเบชเปเบงเบเบเบฑเปเบเบเปเปเปเบเบเบตเป). เบเบปเบเบเบงเบฒเบกเบญเบฒเบเบเบฐเปเบเบฑเบเบเบฐเปเบซเบเบเบชเปเบฒเบฅเบฑเบเบเบปเบเบฎเบนเปเบเบฑเบเบเปเบฒเบญเบดเบเบซเบผเบทเปเบเบทเปเบญเปเบฎเบฑเบเปเบซเปเบเบงเบฒเบกเบฎเบนเปเบเบญเบเบเปเบฒเบเบชเบปเบเบเบทเปเบ.
เปเบเบฑเบเบซเบเบฑเบเบกเบฑเบเบเบฑเบเบซเบกเบปเบ? Transistors เบเบฑเบเบฅเบธเบเบฐเบซเบเบฒเบเบเปเบฒเปเบชเบธเบเบเบตเปเบเบญเบเปเบเบปเบฒเปเบเบปเปเบฒ, เบเบปเบเบซเบกเบฒเบ Moore เบเบฑเบเบเปเบญเบเบเปเบฝเบงเบเบฑเบเบเบฒเบเบเปเบฒเบเบฑเบเบเบงเบฒเบกเปเบงเบเบญเบเปเบชเบเบชเบฐเบซเบงเปเบฒเบเปเบฅเบฐเบเบฑเปเบเบเบฑเปเบเบเบฒเบเปเบเบตเปเบกเบเบถเปเบเปเบกเปเบเบชเบฑเบเปเบเบเปเบซเบฑเบเปเบเบเปเบฒเบเบงเบ, transistors เบซเบผเบฒเบเบชเบฒเบกเบฒเบเปเบฎเบฑเบเปเบเป. เปเบเปเบงเบฅเบฒเบเบฝเบงเบเบฑเบ, เบเปเบฒเบเบงเบเบเปเปเบกเบนเบเบเปเบฒเบฅเบฑเบเปเบเบตเบเปเบ, เปเบฅเบฐเบเบนเปเปเบเปเบเบฒเบเบซเบงเบฑเบเบงเปเบฒเบเบฒเบเบเบญเบเบชเบฐเบซเบเบญเบเบเบฑเบเบเบตเบเบฒเบเบฅเบฐเบเบปเบเบเปเบฒเบเป. เปเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบฑเปเบเบเปเบฒเบง, เบเบฒเบเบเบฝเบเปเบเบฅเปเบเบฅเบก "เบเบปเบเบเบฐเบเบด", เปเบกเบทเปเบญเบเบงเบเปเบฎเบปเบฒเบกเบตเบเบฐเบเบนเปเบเบฐเบเบดเบเบฑเบเบซเบเบถเปเบ, เบเปเปเบกเบตเบเบฐเบชเบดเบเบเบดเบเบปเบเบญเบตเบเบเปเปเปเบ. เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเปเบเปเปเบ somehow เบเบฑเบเบซเบฒเบเบญเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเปเบญเบกเปเบเบฑเบเบซเบผเบท concurrent. เบเบดเปเบเปเบเบเบงเปเบฒเบเบฑเปเบ, เบเบฑเบเบซเบฒเบเบตเปเบกเบตเบขเบนเปเปเบเบฅเบฐเบเบฑเบเบเปเบฒเบเป: เปเบเบฅเบฐเบเบฑเบเบเบญเบเบเบฐเบเบนเป, เบฅเบฐเบเบฑเบเบเบฐเบเบงเบเบเบฒเบ, เปเบเบฅเบฐเบเบฑเบเปเบเบทเปเบญเบเบเบฑเบเปเบเปเบเบทเบญเบเปเบฒเบ (เบฅเบฐเบเบปเบเบเบฒเบเปเบเบเบขเบฒเบ). .NET เบกเบตเปเบเบเปเบเปเบฅเบเบตเบเบตเปเบกเบตเปเบงเบฅเบฒเบเบปเบเบชเบญเบเบเบธเบเบเบฐเบเบฒเบเบชเบนเบเปเบเบทเปเบญเปเบเปเปเบเบเบฑเบเบซเบฒเบเบฑเปเบเบเปเบฒเบงเปเบเปเปเบง เปเบฅเบฐเบกเบตเบเบฐเบชเบดเบเบเบดเบเบฒเบ.
เบเบธเบเบเบฐเบชเบปเบ
Edsger Dijkstra posed เบเบฑเบเบซเบฒเบเบตเปเบเบฑเบเบเบฑเบเบฎเบฝเบเบฅเบฒเบงเปเบเบเบปเปเบเบเบต 1965. เบฎเบนเบเปเบเบเบเบฒเบเบชเปเบฒเบเบเบฑเปเบเบเบถเปเบเปเบกเปเบเบเบฑเปเบเบเปเปเปเบเบเบตเป. เบกเบตเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบตเปเปเบเปเบเบญเบ (เบเบปเบเบเบฐเบเบดเปเบฅเปเบงเบซเปเบฒ) เปเบฅเบฐเบเบปเบงเปเบฅเบเบเบฝเบงเบเบฑเบเบเบญเบเบชเปเบญเบก. เปเบเบปเบฒเปเบเบปเปเบฒเบเบฑเปเบเบขเบนเปเปเบเบฐเบกเบปเบ, เบกเบตเบชเปเบญเบกเบฅเบฐเบซเบงเปเบฒเบเปเบเบปเบฒเปเบเบปเปเบฒ. เบเบฑเบเบเบฑเบเบเบฐเบเบฒเบชเบฒเบกเบฒเบเบเบดเบเบญเบฒเบซเบฒเบเบเบฒเบเบเบฒเบเบญเบฒเบซเบฒเบเบเบตเปเบเปเปเบกเบตเบเบตเปเบชเบดเปเบเบชเบธเบ, เบเบดเบเบซเบผเบทเบฅเปเบเปเบฒ. เปเบเบทเปเบญเบเบดเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒ, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบญเบปเบฒเบชเบญเบเบชเปเบญเบก (เบเบปเบเบชเบธเบเบเปเบฒเบเปเบเปเบเบเบฑเบเบชเปเบญเบกเบเบฑเบเบเบฑเปเบเบเปเบฒเบญเบดเบ). เบเบฒเบเบเบปเบเบเบถเปเบ เปเบฅเบฐเบงเบฒเบเบฅเบปเบเบเบฒเบเบชเปเบญเบกเปเบกเปเบเบชเบญเบเบเบฒเบเบเบฐเบเปเบฒเบเบตเปเปเบเบเบเปเบฒเบเบซเบฒเบ. เบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบฑเบเปเบปเบเปเบกเปเบเบกเบดเบเบเบฝเบ. เบงเบฝเบเบเบฒเบเปเบกเปเบเปเบเบทเปเบญเบเบญเบเบซเบฒเบชเบนเบเบเบฒเบเบเบดเบเปเบฅเปเบเบฑเปเบเบเปเบฒเบงเบเบตเปเบเบฑเบเบซเบกเบปเบเบเบญเบเบเบงเบเปเบเบปเบฒเบเบฐเบเบดเบเปเบฅเบฐเปเบเบฑเบกเบเบตเปเปเบเบดเบเปเบกเปเบเบงเปเบฒเบซเบผเบฑเบเบเบฒเบ 54 เบเบต.
เบเปเบฒเบญเบดเบ, เปเบซเปเบเบฐเบเบฒเบเบฒเบกเปเบเปเปเบเบเบฑเบเบซเบฒเบเบตเปเปเบเบเบเปเบฒเบเบเบฒเบเบเปเบฒเปเบเปเบเบทเปเบเบเบตเปเบฎเปเบงเบกเบเบฑเบ. เบชเปเบญเบกเบเบญเบเบขเบนเปเปเบเบดเบเปเบเบฐเบเบปเปเบงเปเบ เปเบฅเบฐเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบฝเบเปเบเปเปเบญเบปเบฒเบเบงเบเบกเบฑเบเปเบกเบทเปเบญเบเบงเบเปเบเบปเบฒเบขเบนเปเปเบฅเปเบงเปเบญเบปเบฒเบเบทเบ. เบเบตเปเบเบตเปเบกเบตเบเบฑเบเบซเบฒเบเบฑเบ synchronization, เปเบเปเบงเบฅเบฒเบเบตเปเปเบเปเบเบญเบเบเบตเปเบเบฐเปเบญเบปเบฒ surebets? เบเบฐเปเบเบฑเบเปเบเบงเปเบเบเปเบฒเบเปเปเบกเบตเบชเปเบญเบก? เปเบฅเบฐเบญเบทเปเบเป เปเบเปเบเปเบฒเบญเบดเบ, เปเบซเปเปเบฅเบตเปเบกเบเบปเปเบเบเบญเบ philosophers เปเบเป.
เปเบเบทเปเบญเปเบฅเบตเปเบกเบเบปเปเบ threads, เบเบงเบเปเบฎเบปเบฒเปเบเป thread pool เบเปเบฒเบ 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);
}
เบชเบฐเบเบธเบเปเบเบตเบเบฐเบเบนเปเบเบทเบเบญเบญเบเปเบเบเบกเบฒเปเบเบทเปเบญเปเบเบตเปเบกเบเบฐเบชเบดเบเบเบดเบเบฒเบเบเบฒเบเบชเปเบฒเบเปเบฅเบฐเบฅเบถเบ thread. เบชเบฐเบฅเบญเบเบเปเบณเบเบตเปเบกเบตเปเบเบงเบเบตเปเบกเบตเปเปเบฒเบงเบฝเบ เปเบฅเบฐ CLR เบชเปเบฒเบ เบซเบผเบทเบฅเบถเบเบเบฐเบเบนเปเบเบถเปเบเบเบฑเบเบเบณเบเบงเบเบเบญเบเปเปเบฒเบงเบฝเบเปเบซเบผเบปเปเบฒเบเบตเป. เบชเบฐเบเบธเบเปเบเบตเบเบฝเบงเบชเปเบฒเบฅเบฑเบ AppDomains เบเบฑเบเบซเบกเบปเบ. เบชเบฐเบเบธเบเปเบเบตเบเบตเปเบเบงเบเบเบฐเบเบทเบเบเปเบฒเปเบเปเปเบเบทเบญเบเบชเบฐเปเบซเบกเบต, เปเบเบฒเบฐเบงเปเบฒ. เบเปเปเบเปเบฒเปเบเบฑเบเบเปเบญเบเบฅเบปเบเบเบงเบเบเบฒเบเบชเปเบฒเบ, เบฅเบถเบเบเบฐเบเบนเป, เปเบเบงเบเบญเบเปเบเบปเบฒเปเบเบปเปเบฒ, เปเบฅเบฐเบญเบทเปเบเป. เบกเบฑเบเปเบเบฑเบเปเบเปเบเปเปเบเบเบเปเปเบกเบตเบเบฒเบเบชเบฐเบเบธเบเปเบเบต, เปเบเปเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบเปเบญเบเปเบเปเบกเบฑเบเปเบเบเบเบปเบ. Thread
, เบเบตเปเปเบกเปเบเปเบเบฑเบเบเบฐเปเบซเบเบเบชเปเบฒเบฅเบฑเบเบเปเบฅเบฐเบเบตเบเบตเปเบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบกเบตเบเบฒเบเบเปเบฝเบเปเบเบเบเบนเบฅเบดเบกเบฐเบชเบดเบเบเบญเบ thread, เปเบเปเบงเบฅเบฒเบเบตเปเบเบงเบเปเบฎเบปเบฒเบกเบตเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฒเบง, เบชเปเบฒเบฅเบฑเบเบซเบปเบงเบเปเป Foreground, เปเบฅเบฐเบญเบทเปเบเป.
เปเบเบเปเบฒเบชเบฑเบเบเปเบฒเบเปเบญเบทเปเบเป, System.Threading.Tasks.Task
เบซเปเบญเบเบฎเบฝเบเปเบกเปเบเบเบทเบเบฑเบ Thread
, เปเบเปเบกเบตเบเบธเบเบเบฐเปเบเบเบเบญเบเบเบงเบฒเบกเบชเบฐเบเบงเบ: เบเบงเบฒเบกเบชเบฒเบกเบฒเบเปเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบงเบฝเบเบเบฒเบเบซเบผเบฑเบเบเบฒเบเบเบฑเบเบเบญเบเบงเบฝเบเบเบฒเบเบญเบทเปเบเป, เบเบฑเบเบเบทเบเปเบซเปเปเบเบปเบฒเปเบเบปเปเบฒเบเบฒเบเบซเบเปเบฒเบเบตเป, เบชเบฐเบเบงเบเบเบฑเบเบเบงเบฒเบเบเบงเบเปเบเบปเบฒ, เปเบฅเบฐเบญเบทเปเบเป. เปเบฅเบฐเบญเบทเปเบเป.เบเบงเบเปเบเบปเบฒเบกเบตเบเบงเบฒเบกเบเปเบฒเปเบเบฑเบเปเบเบทเปเบญเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบ async / เบฅเปเบเปเบฒเบเบฒเบเบเปเปเบชเปเบฒเบ (Task-based Asynchronous Pattern, เปเปเบฒเบเบฒเบ syntactic เบชเปเบฒเบฅเบฑเบเบเบฒเบเบฅเปเบเปเบฒเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบ IO). เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบเปเบฅเบทเปเบญเบเบเบตเปเบเปเปเบกเบฒ.
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();
}
}
เปเบเบเบตเปเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบฒเบญเบดเบเบเบฐเบเบฒเบเบฒเบกเปเบญเบปเบฒเบชเปเบญเบกเบเปเบฒเบ, เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบชเปเบญเบกเบเบงเบฒ, เปเบฅเบฐเบเปเบฒเบซเบฒเบเบงเปเบฒเบกเบฑเบเปเบฎเบฑเบเบงเบฝเบเบญเบญเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบงเบเปเบฎเบปเบฒเบเบดเบเบญเบฒเบซเบฒเบเปเบฅเบฐเปเบซเปเปเบเบปเบฒเปเบเบปเปเบฒเบเบฑเบเบเบทเบเปเบเบเปเบญเบ. เปเบญเบปเบฒเบซเบเบถเปเบเบชเปเบญเบกเปเบกเปเบเบเบฐเบฅเปเบฒเบกเบฐเบเบน, i.e. เบชเบญเบเบเบฐเบเบนเปเบเปเปเบชเบฒเบกเบฒเบเปเบญเบปเบฒเบซเบเบถเปเบเปเบเปเบงเบฅเบฒเบเบฝเบงเบเบฑเบ (เบเปเปเบเบทเบเบเปเบญเบ: เบเปเบฒเบญเบดเบเบญเปเบฒเบเบงเปเบฒเบชเปเบญเบกเปเบกเปเบเบเปเปเปเบชเบเบเปเบฒ, เบเบตเบชเบญเบ - เปเบเบฑเปเบเบเบฝเบงเบเบฑเบ, เบเปเบฒเบญเบดเบเปเบเปเปเบงเบฅเบฒ, เบเบตเบชเบญเบเปเบเปเปเบงเบฅเบฒ). เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบตเป Interlocked.CompareExchange
, เปเบเบดเปเบเบเปเบญเบเปเบเปเบฎเบฑเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเปเบงเบเบเปเบฒเปเบเบฐเบเปเบฒเบเบญเบเปเบเปเบเบเปเบเบต (TSL
, XCHG
), เปเบเบดเปเบ locks เบเบดเปเบเบชเปเบงเบเบเบญเบเบเบงเบฒเบกเบเบปเบเบเปเบฒเบชเปเบฒเบฅเบฑเบเบเบฒเบเบญเปเบฒเบเบฅเปเบฒเบเบฑเบเบเบฐเบฅเปเบฒเบกเบฐเบเบนเปเบฅเบฐเบเบฒเบเบเบฝเบ. เปเบฅเบฐ SpinWait เปเบกเปเบเบเบฝเบเปเบเบปเปเบฒเบเบฑเบเบเบฒเบเบเปเปเบชเปเบฒเบ while(true)
เบเบฝเบเปเบเปเบกเบต "magic" เปเบฅเบฑเบเบเปเบญเบ - เบเบฐเบเบนเปเปเบเปเปเบงเบฅเบฒเปเบฎเบเบเบฒเบเบเบฐเบฅเบดเบ (Thread.SpinWait
), เปเบเปโเบเบฒเบโเบเบฑเปเบโเบเบฒเบโเปเบญเบโเบเบฒเบโเบเบงเบโเบเบธเบกโเบเบฑเบโเบเบฐโเบเบนเปโเบญเบทเปเบ (Thread.Yeild
) เบซเบผเบทโเบเบญเบโเบซเบฅเบฑเบ (Thread.Sleep
).
เปเบเปเบเบฒเบเปเบเปเปเบเบเบตเปเบเปเปเปเบเปเบเบปเบ, เปเบเบฒเบฐเบงเปเบฒ เบเบฒเบเปเบซเบผเปเบเบปเปเบฒเปเบเปเบงเปเบเบตเป (เบชเปเบฒเบฅเบฑเบเบเปเบญเบเบเบฒเบเปเบเบซเบเบถเปเบเบงเบดเบเบฒเบเบต) เปเบเปเบเบทเบเบชเบฐเบเบฑเบ: เบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบฑเบเบซเบกเบปเบเปเบเปเบชเปเบญเบกเบเปเบฒเบเบเบญเบเปเบเบปเบฒเปเบเบปเปเบฒ, เปเบเปเบเปเปเปเบกเปเบเบเบตเปเบเบทเบเบเปเบญเบ. array เบเบญเบเบชเปเบญเบกเบกเบตเบเปเบฒ: 1 2 3 4 5.
เปเบเบฎเบนเบ, เบเบฅเบฑเบญเบเบเบฐเบเบนเป (deadlock). เบชเบตเบเบฝเบง - เบเบฒเบเบเบฐเบเบดเบเบฑเบ, เบชเบตเปเบเบ - synchronization, เบชเบตเบเบตเปเปเบเบปเปเบฒ - เบเบฐเบเบนเปเปเบกเปเบเบเบญเบ. rhombuses เบเบตเปเบเบญเบเปเบงเบฅเบฒเปเบฅเบตเปเบกเบเบปเปเบเบเบญเบ Tasks.
เบเบงเบฒเบกเบญเบถเบเบซเบดเบงเบเบญเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒ
เปเบเบดเบเปเบกเปเบเบงเปเบฒเบกเบฑเบเบเปเปเบเปเบฒเปเบเบฑเบเบเบตเปเบเบฐเบเบดเบเบซเบผเบฒเบเปเบเบเบชเบฐเปเบเบฒเบฐเบญเบฒเบซเบฒเบ, เปเบเปเบเบงเบฒเบกเบญเบถเบเบซเบดเบงเปเบฎเบฑเบเปเบซเปเบเบนเปเปเบเบเบฐเบเบดเปเบกเบเบฑเบเบเบฐเบเบฒ. เปเบซเปเบเบฐเบเบฒเบเบฒเบกเบเปเบฒเบฅเบญเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบญเบเบเบงเบฒเบกเบญเบถเบเบซเบดเบงเบเบญเบเบเบฐเบเบนเปเปเบเบเบฑเบเบซเบฒเบเบญเบเบเบงเบเปเบฎเบปเบฒ. เบเบงเบฒเบกเบญเบถเบเบซเบดเบงเปเบกเปเบเปเบเปเบงเบฅเบฒเบเบตเปเบเบฐเบเบนเปเบเปเบฒเบฅเบฑเบเปเบฅเปเบ, เปเบเปเบเปเปเบกเบตเบงเบฝเบเบเบตเปเบชเปเบฒเบเบฑเบ, เปเบงเบปเปเบฒเบญเบตเบเบขเปเบฒเบเบซเบเบถเปเบ, เบเบตเปเปเบกเปเบเบเบงเบฒเบกเบเบฒเบเบเบทเบเบฑเบ, เบเบฝเบเปเบเปเบเบฐเบเบธเบเบฑเบเบเบฐเบเบนเปเบเปเปเปเบเปเบเบญเบ, เปเบเปเบขเปเบฒเบเบซเปเบฒเบงเบซเบฑเบเบเบญเบเบซเบฒเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเบเบดเบ, เปเบเปเบเปเปเบกเบตเบญเบฒเบซเบฒเบ. เปเบเบทเปเบญเบซเบผเบตเบเปเบงเบฑเปเบเบเบฒเบเบเบฑเบเบเบงเบฒเบเปเบฅเบทเปเบญเบเป, เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบญเบปเบฒเบชเปเบญเบกเบเบทเบเบเปเบฒเบเบงเบเปเบฎเบปเบฒเบเปเปเบชเบฒเบกเบฒเบเปเบญเบปเบฒเบญเบฑเบเบญเบทเปเบเปเบเป.
// ะขะพ ะถะต ััะพ ะธ ะฒ 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)
);
}
เบชเบดเปเบเบเบตเปเบชเปเบฒเบเบฑเบเบเปเบฝเบงเบเบฑเบเบฅเบฐเบซเบฑเบเบเบตเปเปเบกเปเบเบงเปเบฒเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบชเบญเบเบเบปเบเปเบเบชเบตเปเบเบปเบเบฅเบทเบกเปเบญเบปเบฒเบเบฒเบเปเบเบเบเปเบฒเบเบเบญเบเบเบงเบเปเบเบปเบฒเบฅเบปเบ. เปเบฅเบฐเบกเบฑเบ turns เปเบซเปเปเบซเบฑเบเบงเปเบฒเบเบงเบเปเบเบปเบฒเบเบดเบเบญเบฒเบซเบฒเบเบซเบผเบฒเบ, เปเบเบเบฐเบเบฐเบเบตเปเบเบปเบเบญเบทเปเบเปเบฅเบตเปเบกเบซเบดเบง, เปเบเบดเบเปเบกเปเบเบงเปเบฒเบเบฐเบเบนเปเบกเบตเบเบนเบฅเบดเบกเบฐเบชเบดเบเบเบฝเบงเบเบฑเบ. เปเบเบเบตเปเบเบตเปเบเบงเบเปเบเบปเบฒเบเปเปเปเบเปเบญเบถเบเบซเบดเบงเบขเปเบฒเบเบชเบปเบกเบเบนเบ, เปเบเบฒเบฐเบงเปเบฒ. เบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบตเปเบเปเปเบเบตเปเบฎเบฑเบเปเบซเปเบชเปเบญเบกเบเบญเบเปเบเบปเบฒเปเบเบปเปเบฒเบเบทเบเบเบฒเบเบเบฑเปเบ. เบเบฐเบเบปเบเบงเปเบฒเบเบปเบเบเบตเบเบดเบเปเปเบญเบเบเบงเปเบฒเบเบปเบเบเปเปเบเบตเบเบฐเบกเบฒเบ 5 เปเบเบปเปเบฒ. เบเบฑเปเบเบเบฑเปเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบฐเบซเบเบฒเบเบเปเบญเบเปเบเบฅเบฐเบซเบฑเบเบเปเบฒเปเบเบชเบนเปเบเบฒเบเบซเบผเบธเบเบฅเบปเบเปเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ. เบกเบฑเบเบเบฑเบเปเบเบฑเบเบกเบนเบเบเปเบฒเบเบตเปเบชเบฑเบเปเบเบเบงเปเบฒเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบตเปเบซเบฒเบเบฒเบเปเบกเปเบเปเบเบฑเบเปเบเปเบเปเปเบกเบทเปเบญเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบฑเบเบซเบกเบปเบเปเบเปเบชเปเบญเบกเบเปเบฒเบ, เบเปเปเบกเบตเบเบงเบฒ, เบเบงเบเปเบเบปเบฒเปเบญเบปเบฒเบเปเบฒเบ, เบฅเปเบเปเบฒ, เปเบญเบปเบฒเบเปเบฒเบเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบ, เปเบฅเบฐเบญเบทเปเบเป. เบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบตเปเบเบฑเบเปเบเบฑเบเบเบงเบฒเบกเบญเบถเบเบซเบดเบง, เบเบทเบเบฑเบเบเบงเบฒเบกเบเบฒเบ. เบเปเบญเบเบฅเบปเปเบกเปเบซเบฅเบงเปเบเบเบฒเบเปเบฎเบฑเบเบเปเปเบฒเบกเบฑเบ. เบเปเบฒเบเบฅเบธเปเบกเบเบตเปเปเบกเปเบเบฎเบนเบเบชเปเบฒเบฅเบฑเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบตเปเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบตเปเบเปเปเบเบตเบชเบญเบเบเบปเบเปเบเปเปเบญเบปเบฒเบเบฑเบเบชเบญเบเบชเปเบญเบกเปเบฅเบฐเบชเบญเบเบเบปเบเบเบตเบเปเบฒเบฅเบฑเบเบซเบดเบงเปเบซเบ.
เปเบเบเบตเปเบเบตเปเบเปเบฒเบเบชเบฒเบกเบฒเบเปเบซเบฑเบเปเบเปเบงเปเบฒเบเบฐเบเบนเปเบเบทเปเบเบเบถเปเบเบเบฒเบเบเบฑเปเบเปเบฅเบฐเบเบฐเบเบฒเบเบฒเบกเปเบญเบปเบฒเบเบฑเบเบเบฐเบเบฒเบเบญเบ. เบชเบญเบเบเบญเบเบชเบตเปเปเบเบเบเปเปเปเบฎเบฑเบเบซเบเบฑเบเปเบฅเบตเบ (เปเบชเบฑเปเบเบชเบฐเปเบเบเบชเบตเบเบฝเบงเบเปเบฒเบเปเบเบดเบ).
เบเบฒเบเปเบชเบเบเบตเบงเบดเบเบเบญเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒ
เปเบฅเปเบง, เบเบฑเบเบซเบฒเบญเบตเบเบขเปเบฒเบเบซเบเบถเปเบเบเบตเปเบชเบฒเบกเบฒเบเบเบฑเบเบเบงเบฒเบเบเบฒเบเบเบดเบเปเบเบปเปเบฒเปเบฅเบเบญเบฑเบเบฎเบธเปเบเปเบฅเบเบเบญเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒเปเบกเปเบเบเปเบฒเบซเบเบถเปเบเปเบเบเบงเบเบกเบฑเบเบเบฒเบเบเบฑเบเบเบตเบเบฑเบเปเบเบเปเบงเบเบชเปเบญเบกเบขเบนเปเปเบเบกเบทเบเบญเบเบฅเบฒเบง (เปเบฅเบฐเบเบงเบเปเบเบปเบฒเบเบฐเบเบฑเบเบฅเบฒเบงเปเบเบเบเบฑเปเบ). เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบเบฐเปเบเบเปเบเบทเปเบญเบเบเปเบฒเบเบเบฐเบเบทเบเบเบฐเปเบงเปเปเบเบเบเปเปเบกเบตเบญเบฒเบซเบฒเบเบเปเปเบฒ. เบเปเบฒเบเบชเบฒเบกเบฒเบเบกเบฒเบเปเบญเบกเบเบฑเบเบฅเบฐเบซเบฑเบเบเบปเบงเบขเปเบฒเบเบชเปเบฒเบฅเบฑเบเบเปเบฅเบฐเบเบตเบเบตเปเบเบปเบงเบเปเบฒเบเปเบญเบ, เบเบปเบงเบขเปเบฒเบ, เบกเบฑเบเบเบทเบเบเบดเปเบกเบญเบญเบ NullReferenceException
เบซเบผเบฑเบเบเบฒเบ philosopher เปเบเปเปเบงเบฅเบฒเบชเปเบญเบก. เปเบฅเบฐ, เปเบเบเบงเบดเบเบตเบเบฒเบเบเบฒเบ, เบเปเปเบเบปเบเปเบงเบฑเปเบเบเบฐเบเปเปเบเบทเบเบเบฑเบเบเบฒเบเปเบฅเบฐเบฅเบฐเบซเบฑเบเบเบฒเบเปเบเบเบฐเบเปเปเบเบฝเบเปเบเปเบเบฑเบเบกเบฑเบ (เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบตเป AppDomain.CurrentDomain.UnhandledException
เปเบฅเบฐ เบญเบทเปเบเป). เปเบเบฒเบฐเบชเบฐเบเบฑเปเบ, เบเบฒเบเบเบฑเบเบเบฒเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเปเบกเปเบเบเปเบฒเปเบเบฑเบเปเบเบเบฐเบเบนเปเบเบปเบงเปเบญเบเปเบฅเบฐเบเปเบงเบเบเบฒเบเบขเบธเบเปเบเบปเบฒเบขเปเบฒเบเบชเบฐเบซเบเปเบฒเบเบฒเบก.
The waiter
เบเบปเบเบฅเบปเบ, เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเปเปเบเบเบฑเบเบซเบฒเบเบฒเบเบขเบธเบเบเบฐเบเบฑเบ, เบเบงเบฒเบกเบญเบถเบเบซเบดเบง, เปเบฅเบฐเบเบงเบฒเบกเบเบฒเบเบเบตเปเปเบเบงเปเบ? เบเบงเบเปเบฎเบปเบฒเบเบฐเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบฝเบเบเบปเบเบเบฝเบงเปเบเบปเปเบฒเบซเบฒเบเบฒเบเบชเปเบญเบก, เปเบเบตเปเบกเบเบฒเบเบเบปเบเปเบงเบฑเปเบเปเบเบดเปเบเบเบฑเบเปเบฅเบฐเบเบฑเบเบเบญเบเบเบฐเบเบนเปเบชเปเบฒเบฅเบฑเบเบชเบฐเบเบฒเบเบเบตเปเบเบตเป. เปเบฎเบฑเบเปเบเบงเปเบเบกเบฑเบ? เบชเบปเบกเบกเบธเบเบงเปเบฒเบเบนเปเบฎเบฑเบเปเบเปเบขเบทเบเบขเบนเปเบเปเบฒเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒ, เบเบนเปเบเบตเปเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบปเบเปเบเบเบปเบเบซเบเบถเปเบเปเบญเบปเบฒเบชเปเบญเบก. เปเบฎเบฑเบเปเบเบงเปเบเบเบงเบเปเบฎเบปเบฒเปเบฎเบฑเบเปเบซเป waiter เบเบตเปเปเบฅเบฐ philosophers เบเบฐเบเบฒเบกเปเบเบปเบฒ, เบเปเบฒเบเบฒเบกเปเบกเปเบเบซเบเปเบฒเบชเบปเบเปเบ.
เบงเบดเบเบตเบเบตเปเบเปเบฒเบเบเบฒเบเบเบตเปเบชเบธเบเปเบกเปเบเปเบงเบฅเบฒเบเบตเปเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบฝเบเปเบเปเบเบฐเบเปเปเบซเปเบเบนเปเบฎเบฑเบเปเบเปเบขเบนเปเบชเบฐเปเบซเบกเบตเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบชเปเบญเบก. เปเบซเบผเบปเปเบฒเบเบฑเปเบ. เปเบเบเบฑเบเบเบธเบเบฑเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบฐเบเปเปเบฅเปเบเปเบฒเบชเปเบฒเบฅเบฑเบเบชเปเบญเบกเบขเบนเปเปเบเปเป, เปเบเปเบฅเปเบเปเบฒเบซเบผเบทเบเบฒเบกเบเบนเปเบฅเปเบเปเบฒ. เปเบเบเบญเบเบเปเบฒเบญเบดเบ, เบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฝเบเปเบเป User Space เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบตเป, เปเบเบกเบฑเบเบเบงเบเปเบฎเบปเบฒเบเปเปเปเบเปเบเบฒเบเบเบฑเบเบเบงเบฒเบเปเบเบทเปเบญเปเบเบซเบฒเบเบฑเปเบเบเบญเบเปเบเปเบเบฒเบเปเบเปเบ (เบเปเบฝเบงเบเบฑเบเบเบงเบเบกเบฑเบเบเปเบฒเบเบฅเบธเปเบกเบเบตเป).
เบเบฒเบเปเบเปเปเบเปเบเบเบทเปเบเบเบตเปเบเบนเปเปเบเป
เปเบเบเบตเปเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฐเปเบฎเบฑเบเปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบเบเบงเบเปเบฎเบปเบฒเปเบเบตเบเปเบฎเบฑเบเบเบฑเบเบซเบเบถเปเบเบชเปเบญเบกเปเบฅเบฐเบชเบญเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒ, เบเบงเบเปเบฎเบปเบฒเบเบฐ spin เปเบเบงเบปเบเบเบญเบเปเบฅเบฐเบฅเปเบเปเบฒ. เปเบเปเปเบเบเบฑเบเบเบธเบเบฑเบเบกเบฑเบเบเบฐเปเบเบฑเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบฑเบเบซเบกเบปเบเปเบฅเบฐ, เบเบฑเปเบเบเบตเปเบกเบฑเบเปเบกเปเบ, เบเบฝเบเปเบเปเบซเบเบถเปเบเบชเปเบญเบก, i.e. เบกเบฑเบเบชเบฒเบกเบฒเบเปเบงเบปเปเบฒเปเบเปเบงเปเบฒเบกเบตเบเบฝเบเปเบเปเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบตเปเปเบญเบปเบฒ "เบชเปเบญเบกเบเบญเบ" เบเบตเปเบเบฒเบ waiter เบเบตเปเบเบฐเบเบดเบเบญเบฒเบซเบฒเบ. เบชเปเบฒเบฅเบฑเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเปเบเป 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; }
, เปเบเปเบกเบต "magic" เบซเบผเบฒเบเบเบงเปเบฒเปเบ SpinWait
(เบเบตเปเบเบทเบเบเปเบฒเปเบเปเบขเบนเปเบเบตเปเบเบฑเปเบ). เบเบฑเบโเบเบตเปโเบฅเบฒเบงโเบฎเบนเปโเบงเบดเบเบตโเบเบฑเบโเบเบปเบโเบเบตเปโเบฅเปโเบเปเบฒ, เปเบฎเบฑเบโเปเบซเปโเปเบเบปเบฒโเปเบเบปเปเบฒโเบเบญเบโเปเปเบญเบโเปเบถเปเบ, เปเบฅเบฐโเบญเบทเปเบเป. เปเบฅเบฐเบญเบทเปเบเป. เปเบเบเบเบปเปเบงเปเบ, เปเบฎเบฑเบเบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเบเบตเปเปเบเบฑเบเปเบเปเบเปเปเบเบทเปเบญเปเบเบตเปเบกเบเบฐเบชเบดเบเบเบดเบเบฒเบ. เปเบเปเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบทเปเปเบงเปเบงเปเบฒเบเบตเปเบเบฑเบเบเบปเบเปเบเบฑเบเบงเบปเบเบเบญเบเบเบฒเบเปเบเบทเปเบญเบเปเบซเบงเบเบฝเบงเบเบฑเบเบเบตเปเบเบดเบเปเบเบดเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเบเบญเบเปเบเปเบเบเปเบเบตเปเบฅเบฐเบฎเบฑเบเบชเบฒเบเบฒเบเปเบซเบผเปเบเบปเปเบฒ, เปเบเบดเปเบเบชเบฒเบกเบฒเบเบเปเบฒเปเบเบชเบนเปเบเบงเบฒเบกเบญเบถเบเบซเบดเบงเบเปเบฒเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบปเบเบซเบเบถเปเบเบเบฒเบเปเบเบฑเบเบเบนเบฅเบดเบกเบฐเบชเบดเบเบซเบผเบฒเบเบเปเบงเบฒเบเบปเบเบญเบทเปเบ, เปเบเปเบเปเปเบกเบตเบชเปเบญเบกเบเบญเบ (เบเบฑเบเบซเบฒ Priority Inversion) . เบเบฑเปเบเบเบฑเปเบ, เบเบงเบเปเบฎเบปเบฒเปเบเปเบกเบฑเบเบเบฝเบเปเบเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเปเบฝเบเปเบเบเบเบตเปเบชเบฑเปเบเบซเบผเบฒเบเปเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบเบตเปเปเบเปเบฎเปเบงเบกเบเบฑเบ, เปเบเบเบเปเปเบกเบตเบเบฒเบเปเบเบซเบฒเบเบฒเบเบชเปเบงเบเบเบตเบชเบฒเบก, locks เบฎเบฑเบ, เปเบฅเบฐเบเบงเบฒเบกเปเบเบเปเบเบญเบทเปเบเป.
เปเบเปเบกเบชเปเบฒเบฅเบฑเบ SpinLock
. เบชเบฒเบเบเปเปเบฒเปเบกเปเบ "เบเปเปเบชเบนเป" เบขเปเบฒเบเบเปเปเปเบเบทเปเบญเบเบชเปเบฒเบฅเบฑเบเบเบงเบฒเบกเบเบฒเบงเบเบญเบเบชเปเบญเบกเบเบญเบ. เบกเบตเบเบงเบฒเบกเบฅเบปเปเบกเปเบซเบฅเบง - เปเบเบฎเบนเบ, เบเบทเปเบเบเบตเปเบเบตเปเปเบฅเบทเบญเบ. เบซเบผเบฑเบเบเปเปเปเบเปเบเบทเบเบเปเบฒเปเบเปเบขเปเบฒเบเปเบเบฑเบกเบชเปเบงเบ: เบเบฝเบเปเบเปเบเบฐเบกเบฒเบ 2/3 เปเบเบเบชเบตเปเบเบฐเบเบนเปเปเบซเบผเบปเปเบฒเบเบตเป.
เบเบฒเบเปเบเปเปเบเบญเบตเบเบญเบฑเบเบซเบเบถเปเบเบขเบนเปเบเบตเปเบเบตเปเปเบกเปเบเบเบฒเบเบเปเบฒเปเบเปเปเบเบปเปเบฒเบเบฑเปเบ Interlocked.CompareExchange
เบเปเบงเบเบเบฒเบเบฅเปเบเปเบฒเบขเปเบฒเบเบซเปเบฒเบงเบซเบฑเบเบเบฝเบงเบเบฑเบเบเบตเปเบชเบฐเปเบเบเบขเบนเปเปเบเบฅเบฐเบซเบฑเบเบเปเบฒเบเปเบเบดเบ (เปเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบตเปเบญเบถเบเบซเบดเบง), เปเบเปเบเบตเป, เบเบฑเปเบเบเบตเปเปเบเปเบเปเบฒเบงเบกเบฒเปเบฅเปเบง, เปเบเบเบฒเบเบเบดเบเบชเบฐเบเบตเบชเบฒเบกเบฒเบเบเปเบฒเปเบเบชเบนเปเบเบฒเบเบเบฑเบเบเบงเบฒเบ.
เบเปเบฝเบงเบเบฑเบ Interlocked
เบเบงเบเบชเบฑเบเปเบเบเบงเปเบฒเบกเบตเบเปเปเบเบฝเบเปเบเป CompareExchange
, เปเบเปเบเบฑเบเบงเบดเบเบตเบเบฒเบเบญเบทเปเบเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฐเบฅเปเบฒเบกเบฐเบเบนเบญเปเบฒเบเปเบฅเบฐเบเบฝเบ. เปเบฅเบฐเปเบเบเบเปเบฒเบเบเบฒเบเบเปเปเบฒเบเบฑเบเบเบญเบเบเบฒเบเบเปเบฝเบเปเบเบ, เปเบเบเปเบฅเบฐเบเบตเบเบตเปเบเบฐเบเบนเปเบญเบทเปเบเบกเบตเปเบงเบฅเบฒเบเบตเปเบเบฐเปเบฎเบฑเบเบเบฒเบเบเปเบฝเบเปเบเบเบเบญเบเบกเบฑเบ (เบญเปเบฒเบ 1, เบญเปเบฒเบ 2, เบเบฝเบ 2, เบเบฝเบ 1 เปเบกเปเบเบเปเปเบเบต), เบกเบฑเบเบชเบฒเบกเบฒเบเบเบทเบเบเปเบฒเปเบเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเปเบฝเบเปเบเบเบเบตเปเบชเบฑเบเบชเบปเบเบเบฑเบเบเปเบฒเบเบฝเบง (Interlocked Anything pattern) .
เบเบฒเบเปเบเปเปเบเบฎเบนเบเปเบเบ Kernel
เปเบเบทเปเบญเบซเบผเบตเบเปเบงเบฑเปเบเบเบฒเบเบชเบนเบเปเบชเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเปเบเบงเบปเบ, เปเบซเปเปเบเบดเปเบเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบเบฅเบฑเบญเบเบเบฐเบเบนเปเปเบเปเปเบเบงเปเบ. เปเบเบเปเบฒเบชเบฑเบเบเปเบฒเบเปเบญเบทเปเบเป, เบชเบทเบเบเปเปเบเบปเบงเบขเปเบฒเบเบเบญเบเบเบงเบเปเบฎเบปเบฒ, เปเบซเปเบเบงเบเปเบฎเบปเบฒเปเบเบดเปเบเบงเบดเบเบตเบเบฒเบ waiter เปเบฎเบฑเบเปเบซเป philosopher เบเบญเบเปเบฅเบฐ wakes เบฅเบฒเบงเบเบฝเบเปเบเปเปเบเปเบงเบฅเบฒเบเบตเปเบเปเบฒเปเบเบฑเบ. เบเปเบฒเบญเบดเบ, เปเบซเปเปเบเบดเปเบเบงเบดเบเบตเบเบฒเบเปเบฎเบฑเบเบชเบดเปเบเบเบตเปเปเบเบเบเปเบฒเบเบฎเบนเบเปเบเบ kernel เบเบญเบเบฅเบฐเบเบปเบเบเบฐเบเบดเบเบฑเบเบเบฒเบ. เปเบเบเบชเปเบฒเบเบเบฑเบเบซเบกเบปเบเบขเบนเปเบเบตเปเบเบฑเปเบเบกเบฑเบเบเบฐเบเปเบฒเบเบงเปเบฒเบขเบนเปเปเบเบเบทเปเบเบเบตเปเบเบญเบเบเบนเปเปเบเป. เบเบปเบงเบขเปเบฒเบเบเปเบฒเบฅเบปเบเบซเบผเบฒเบเบเบฑเปเบ AutoResetEvent
เบญเบฒเบเบเบฐเบเปเบฒเบเบงเปเบฒ 53 เปเบเบปเปเบฒ SpinLock
[เบฃเบดเบเปเบเบต]. เปเบเปเบเปเบงเบเบเบฒเบเบเปเบงเบเปเบซเบผเบทเบญเบเบญเบเบเบงเบเปเบเบปเบฒ, เบเปเบฒเบเบชเบฒเบกเบฒเบ synchronize เบเบฐเบเบงเบเบเบฒเบเปเบเบเบปเปเบงเบฅเบฐเบเบปเบ, เบเบฑเบเบเบฒเบเบซเบผเบทเบเปเป.
เบเบฒเบเบเปเปเบชเปเบฒเบเบเบทเปเบเบเบฒเบเบขเบนเปเบเบตเปเบเบตเปเปเบกเปเบ semaphore เบเบตเปเบชเบฐเปเบซเบเบตเปเบเบ Dijkstra เบซเบผเบฒเบเบเบงเปเบฒเปเบเบดเปเบเบซเบเบถเปเบเบชเบฐเบเบฐเบงเบฑเบเบเปเบญเบเบซเบเปเบฒเบเบตเป. A semaphore เปเบกเปเบ, เปเบงเบปเปเบฒเบเปเบฒเบเป, เปเบเบฑเบเบเปเบฒเบเบงเบเบเบงเบเบเบตเปเบเบธเปเบกเบเบญเบเปเบเบเบฅเบฐเบเบปเบ, เปเบฅเบฐเบเบฒเบเบเบฐเบเบดเบเบฑเบเบชเบญเบเบขเปเบฒเบเบเปเบฝเบงเบเบฑเบเบกเบฑเบ, เปเบเบตเปเบกเปเบฅเบฐเบซเบผเบธเบเบฅเบปเบ. เบเปเบฒเบกเบฑเบเบซเบผเบธเบเบฅเบปเบ, เบชเบนเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบฐเบเบนเปเบเบฒเบเปเบเบเบฐเบเบทเบเบเบฅเบฑเบญเบ. เปเบกเบทเปเบญเบเบปเบงเปเบฅเบเบเบทเบเปเบเบตเปเบกเบเบถเปเบเปเบเบเบเบฐเบเบนเป / เบเบฐเบเบงเบเบเบฒเบเบญเบทเปเบเปเบเบตเปเบกเบตเบเบฒเบเปเบเบทเปเบญเบเปเบซเบง, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบฐเบเบนเปเบเบทเบเบเปเบฒเบกเปเบฅเบฐ semaphore เบเบทเบเบซเบผเบธเบเบฅเบปเบเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบเปเบเบเบเปเบฒเบเบงเบเบเบตเปเบเปเบฒเบ. เบเบปเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบเบดเบเบเบฐเบเบฒเบเบฒเบเบฅเบปเบเปเบเบขเบนเปเปเบเบเปเบเบงเบเบเบตเปเบกเบต semaphore. .NET เบชเบฐเปเบซเบเบตเปเบเบเบชเปเบฒเบเบซเบผเบฒเบเบขเปเบฒเบเบเบตเปเบกเบตเบซเบเปเบฒเบเบตเปเบเปเบฒเบเบเบทเบเบฑเบ: AutoResetEvent
, ManualResetEvent
, Mutex
เปเบฅเบฐเบเบปเบงเบเปเบญเบเปเบญเบ Semaphore
. เบเบงเบเปเบฎเบปเบฒเบเบฐเบเปเบฒเปเบเป AutoResetEvent
, เบเบตเปเปเบกเปเบเบเปเบฒเบเบเบฒเบเบเบตเปเบชเบธเบเบเบญเบเบเบฒเบเบเปเปเบชเปเบฒเบเปเบซเบผเบปเปเบฒเบเบตเป: เบเบฝเบเปเบเปเบชเบญเบเบเปเบฒ 0 เปเบฅเบฐ 1 (false, true). เบงเบดเบเบตเบเบฒเบเบเบญเบเบเบฒเบ WaitOne()
เบเบฅเบฑเบญเบเบเบฐเบเบนเปเบเบฒเบเปเบเบเปเบฒเบเปเบฒเปเบกเปเบ 0, เปเบฅเบฐเบเปเบฒ 1, เบซเบผเบธเบเบฅเบปเบเปเบเบฑเบ 0 เปเบฅเบฐเบเปเบฒเบกเบกเบฑเบ. เบงเบดเบเบตเบเบฒเบ Set()
เปเบเบตเปเบกเบเบถเปเบเปเบเบฑเบ 1 เปเบฅเบฐเปเบซเปเบเบนเปเบฎเบฑเบเปเบเปเบซเบเบถเปเบเบเปเบฒเบ, เบเบนเปเบเบตเปเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบเบซเบผเบธเบเบฅเบปเบเปเบเบฑเบ 0. เบเบฐเบเบดเบเบฑเบเบเปเบฒเบเบเบท turnstile เบฅเบปเบเปเบเปเบเปเบเบดเบ.
เบเปเปเบซเปเบชเบฑเบเบชเบปเบเบเบฒเบเปเบเปเปเบเปเบฅเบฐเบเปเบฒเปเบเปเบฅเบฑเบญเบเบชเปเบฒเบฅเบฑเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒเปเบเปเบฅเบฐเบเบปเบ, เปเบฅเบฐเบเปเปเปเบกเปเบเบชเปเบฒเบฅเบฑเบเบเบฑเบเบซเบกเบปเบเปเบเปเบงเบฅเบฒเบเบฝเบงเบเบฑเบ. เปเบซเบผเบปเปเบฒเบเบฑเปเบ. เปเบเบเบฑเบเบเบธเบเบฑเบเบชเบฒเบกเบฒเบเบกเบตเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบซเบผเบฒเบเบเบปเบเปเบเปเบงเบฅเบฒเบเบฝเบงเบเบฑเบ, เปเบฅเบฐเบเปเปเปเบกเปเบเบซเบเบถเปเบ. เปเบเปเบเบงเบเปเบฎเบปเบฒเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบเบเบฑเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบเบฒเบเบฐเบฅเบฒเบเปเบเบทเปเบญเปเบซเปเบเบทเบเบเปเบญเบ, เบซเบผเบตเบเปเบงเบฑเปเบเบเบฒเบเปเบเบทเปเบญเบเบฒเบ (เปเบเบทเปเบญเบเปเบเปเบเบทเปเบญเบเบฒเบ), เปเบซเปเปเบเปเปเบเบงเปเบฒเบเบฒเบbets.
// ะะปั ะฑะปะพะบะธัะพะฒะฐะฝะธั ะพัะดะตะปัะฝะพะณะพ ัะธะปะพัะพัะฐ.
// ะะฝะธัะธะฐะปะธะทะธััะตััั: 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();
}
เปเบเบทเปเบญเปเบเบปเปเบฒเปเบเบชเบดเปเบเบเบตเปเปเบเบตเบเบเบถเปเบเบขเบนเปเบเบตเปเบเบตเป, เบเบดเบเบฒเบฅเบฐเบเบฒเบเปเบฅเบฐเบเบตเบเบตเปเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบฅเบปเปเบกเปเบซเบฅเบงเปเบเบเบฒเบเบชเปเบญเบกเปเบเบก, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบฒเบเบเบฐเบเปเบฒเบเบญเบเบฅเบฒเบงเบเบฐเปเบเบฑเบเบเบฑเปเบเบเปเปเปเบเบเบตเป. เบฅเบฒเบงเบเปเบฒเบฅเบฑเบเบฅเปเบเปเบฒเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบเบฒเบเบฐเบฅเบฒเบ. เปเบกเบทเปเบญเปเบเปเบฎเบฑเบเบกเบฑเบ, เบฅเบฒเบงเบเบฐเบเบฒเบเบฒเบกเปเบญเบปเบฒเบชเปเบญเบก. เบเปเปเปเบเปเบเบปเบ. เบกเบฑเบเปเบซเปเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบเบฒเบเบฐเบฅเบฒเบ (เบเบฒเบเบเบปเบเปเบงเบฑเปเบเปเบเบดเปเบเบเบฑเบเปเบฅเบฐเบเบฑเบ). เปเบฅเบฐเบเปเบฒเบ "turnstile" เบเบญเบเบฅเบฒเบง (AutoResetEvent
) (เบเบงเบเปเบเบปเบฒเปเบเบตเบเปเบเปเบเบทเปเบญเบเบเบปเปเบ). เบกเบฑเบเปเบเบปเปเบฒเปเบเปเบเบงเบปเบเบเบญเบเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบ, เปเบเบฒเบฐเบงเปเบฒ เบฅเบฒเบงเบเปเปเบกเบตเบชเปเบญเบก. เบฅเบฒเบงเบเบฐเบเบฒเบเบฒเบกเปเบญเบปเบฒเบเบงเบเบกเบฑเบเปเบฅเบฐเบขเบธเบเบขเบนเป "turnstile" เบเบญเบเบฅเบฒเบง. เบเบฒเบเบเบฐเปเบเบเปเบเบทเปเบญเบเบเปเบฒเบเบเบตเปเปเบเบเบเบตเบซเบผเบฒเบเบเบฒเบเบเปเบฒเบเบเบงเบฒเบซเบผเบทเบเปเบฒเบ, เบเบดเบเบญเบฒเบซเบฒเบเบชเปเบฒเปเบฅเบฑเบเบฎเบนเบ, เบเบปเบเบฅเบฑเบญเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเบเบงเบเปเบฎเบปเบฒ, "เปเบเบตเบ turnstile เบฅเบฒเบง." เบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเบเบงเบเปเบฎเบปเบฒเบเปเบฒเบเบกเบฑเบ (เปเบฅเบฐเบกเบฑเบเบเบดเบเบขเบนเปเบซเบฅเบฑเบเบกเบฑเบ) เปเบเบฑเบเบเบฑเปเบเบเบตเบชเบญเบ. เบฅเบฒเบงเบเบฐเบเบฒเบเบฒเบกเปเบเบฑเบเบเบฑเปเบเบเบตเบชเบฒเบกเปเบเบทเปเบญเปเบญเบปเบฒเบชเปเบญเบก. เปเบเบโเบเบต. เปเบฅเบฐเบฅเบฒเบงเบเปเบฒเบ turnstile เบฅเบฒเบงเปเบเบทเปเบญเบฎเบฑเบเบเบฐเบเบฒเบเบญเบฒเบซเบฒเบ.
เปเบกเบทเปเบญเบกเบตเบเปเปเบเบดเบเบเบฒเบเปเบเบเบชเบธเปเบกเปเบเบฅเบฐเบซเบฑเบเบเบฑเปเบเบเปเบฒเบง (เบเบงเบเบกเบฑเบเบกเบตเบขเบนเปเบชเบฐเปเบซเบกเบต), เบเบปเบงเบขเปเบฒเบ, เปเบเบทเปเบญเบเบเปเบฒเบเบเบทเบเบฅเบฐเบเบธเบเปเปเบเบทเบเบเปเบญเบเบซเบผเบทเบงเบฑเบเบเบธเบเบฝเบงเบเบฑเบเบเบทเบเบชเปเบฒเบเบเบทเปเบ. AutoResetEvent
เบชเปเบฒเบฅเบฑเบเบเบธเบเบเบปเบ (Enumerable.Repeat
), เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ philosophers เบเบฐเปเบเปเบฎเบฑเบเบเบฒเบเบฅเปเบเปเบฒเบชเปเบฒเบฅเบฑเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒ, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒ เบเบฒเบเบเบญเบเบซเบฒเบเปเปเบเบดเบเบเบฒเบเปเบเบฅเบฐเบซเบฑเบเบเบฑเปเบเบเปเบฒเบงเปเบกเปเบเบเปเบญเบเบเปเบฒเบเปเบเบฑเบเบงเบฝเบเบเบตเปเบเบฒเบ. เบเบฑเบเบซเบฒเบญเบตเบเบญเบฑเบเบซเบเบถเปเบเบเบญเบเบเบฒเบเปเบเปเปเบเบเบตเปเปเบกเปเบเบงเปเบฒเบกเบฑเบเบเปเปเบฎเบฑเบเบเบฐเบเบฑเบเบงเปเบฒเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบฒเบเบเบปเบเบเบฐเบเปเปเบซเบดเบง.
เบงเบดเบเบตเปเบเปเปเบเปเบเบเบเบฐเบชเบปเบก
เบเบงเบเปเบฎเบปเบฒเปเบเปเปเบเบดเปเบเบชเบญเบเบงเบดเบเบตเบเบฒเบเบเปเบฒเบเบปเบเปเบงเบฅเบฒ, เปเบเปเบงเบฅเบฒเบเบตเปเบเบงเบเปเบฎเบปเบฒเบขเบนเปเปเบเปเบซเบกเบเบเบนเปเปเบเปเปเบฅเบฐ loop, เปเบฅเบฐเปเบเปเบงเบฅเบฒเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฑเบ thread เบเปเบฒเบ kernel. เบงเบดเบเบตเบเปเบฒเบญเบดเบเปเบกเปเบเบเบตเบชเปเบฒเบฅเบฑเบ locks เบชเบฑเปเบ, เบเบตเบชเบญเบเบชเปเบฒเบฅเบฑเบเบเบฒเบง. เบกเบฑเบเบกเบฑเบเบเบฐเบกเบตเบเบงเบฒเบกเบเปเบฒเปเบเบฑเบเบเปเบฒเบญเบดเบเบฅเปเบเปเบฒเปเบฅเบเบฐเบชเบฑเปเบเปเบชเปเบฒเบฅเบฑเบเบเบปเบงเปเบเบเบตเปเบกเบตเบเบฒเบเบเปเบฝเบเปเบเบเปเบ loop, เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบชเบฐเบเบฑเบ thread เปเบเปเบงเบฅเบฒเบเบตเปเบฅเปเบเปเบฒเปเบกเปเบเบเบฒเบง. เบงเบดเบเบตเบเบฒเบเบเบตเปเปเบกเปเบเบเบฐเบเบดเบเบฑเบเปเบเบญเบฑเบเบเบตเปเปเบญเบตเปเบเบงเปเบฒ. เปเบเบเบชเปเบฒเบเบเบฐเบชเบปเบก. เบเบตเปเปเบกเปเบเปเบเบเบชเปเบฒเบเบเบฝเบงเบเบฑเบเบเบฑเบเปเบซเบกเบ kernel, เปเบเปเบเบญเบเบเบตเปเบกเบตเบฎเบนเบเปเบเบเบเบนเปเปเบเป: SemaphorSlim
, ManualResetEventSlim
เปเบฅเบฐเบญเบทเปเบเป เบเบฒเบเบญเบญเบเปเบเบเบเบตเปเบเบดเบเบปเบกเบซเบผเบฒเบเบเบตเปเบชเบธเบเบขเบนเปเบเบตเปเบเบตเปเปเบกเปเบ Monitor
, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒ เปเบ C # เบกเบตเบเบทเปเบชเบฝเบ lock
syntax. Monitor
เบเบตเปเปเบกเปเบ semaphore เบเบฝเบงเบเบฑเบเบเบฑเบเบเปเบฒเบชเบนเบเบชเบธเบเบเบญเบ 1 (mutex), เปเบเปเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบฅเปเบเปเบฒเปเบ loop, recursion, เบฎเบนเบเปเบเบเบเบฒเบเบเปเบฝเบเปเบเบเปเบเบทเปเบญเบเปเบ (เปเบเบตเปเบกเปเบเบตเบกเบเปเบฝเบงเบเบฑเบเบงเปเบฒเบเปเบฒเบเบฅเบธเปเบกเบเบตเป), เปเบฅเบฐเบญเบทเปเบเป. เปเบซเปเบเบงเบเปเบฎเบปเบฒเปเบเบดเปเบเบเบฒเบเปเบเปเปเบเบเบฑเบเบกเบฑเบ.
// ะกะฟัััะตะผ ะพะฑัะตะบั ะดะปั ะะพะฝะธัะพัะฐ ะพั ะฒัะตั
, ััะพะฑั ะฑะตะท ะดะตะดะปะพะบะพะฒ.
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);
}
}
เบญเบตเบเปเบเบทเปเบญเปเบถเปเบเบเบงเบเปเบฎเบปเบฒเบเบดเบเบเบฑเปเบเปเบเบฐเบเบฑเบเปเบปเบเปเบเบทเปเบญเปเบเบปเปเบฒเบซเบฒเบชเปเบญเบก, เปเบเปเบเบญเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบณเบฅเบฑเบเบเบปเบเบเบฅเบฑเบญเบเบเบธเบเบซเบปเบงเบเปเปเปเบเปเบเบทเปเบญเบเบฝเบง, เปเบฅเบฐเบเปเปเปเบกเปเบเปเบเบทเปเบญเบเบเปเบฒเบเปเบกเบทเปเบญเบกเบตเบเบปเบเบเบดเบเปเบเบปเปเบฒเปเบฅเปเบง. เปเบซเบผเบปเปเบฒเบเบฑเปเบ. เบเปเบฒเบญเบดเบ, เบกเบตเบเบปเบเบเบดเบเปเบฅเบฐเบเบฑเบเบเบฐเปเบเบเปเบเบทเปเบญเบเบเปเบฒเบ, เปเบฅเบฐเปเบเปเบงเบฅเบฒเบเบตเปเบเบปเบเบเบตเปเบชเปเบฒเปเบฅเบฑเบ, เปเบเปเบเปเบญเบเบเบฒเบเบเบตเปเบเบฐเบเบดเบเบญเบฒเบซเบฒเบเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบเบเบฑเบเบเบต, เบฅเบฒเบงเปเบเบปเปเบฒเปเบเปเบเบเบฑเบเปเบฅเบฐเบเบธเบเปเบเบทเปเบญเบเบเปเบฒเบเบเบญเบเบเบปเบ, เปเบเบฒเบฐเบงเปเบฒ. เปเบงเบฅเบฒเบฅเปเบเปเบฒเบเบญเบเบกเบฑเบเบซเบเปเบญเบเบฅเบปเบ.
เบเบตเปโเบเบทโเบงเบดเบเบตโเบเบตเปโเบเบงเบโเปเบฎเบปเบฒโเบซเบผเบตเบโเบฅเปเบฝเบโเบเบฒเบโเบเบดเบโเบฅเปเบญเบกโเปเบฅเบฐโเบเบงเบฒเบกโเบญเบถเบเบขเบฒเบโเบเบญเบโเบเบฑเบโเบเบฑเบเบเบฐเบเบฒโเบเบฒเบโเบเบปเบ. เบเบงเบเปเบฎเบปเบฒเปเบเป loop เบชเปเบฒเบฅเบฑเบเบเบฒเบเบฅเปเบเปเบฒเบชเบฑเปเบเปเบฅเบฐเบเบฑเบเบเบฐเบเบนเปเบชเปเบฒเบฅเบฑเบเบเบฒเบงเบซเบเบถเปเบ. เบเบฒเบเบเบปเบเบเบฅเบฑเบญเบเบเบธเบเบเบปเบเปเบเบเบฑเปเบเบเบฝเบงเปเบกเปเบเบเปเบฒเบเบงเปเบฒเบเปเบฒเบเบฝเบเปเบเปเปเบเบทเปเบญเบเบเปเบฒเบเบเบทเบเบเบปเบเบเบฅเบฑเบญเบ, เบเบทเบเบฑเบเบเบฒเบเปเบเปเปเบเบเปเบงเบ AutoResetEvent
, เปเบเปเบเบงเบฒเบกเปเบเบเบเปเบฒเบเบเปเปเบเบงเบเบเบฐเบกเบตเบเบฐเบซเบเบฒเบเปเบซเบเป, เปเบเบฒเบฐเบงเปเบฒ เบเบฐเบเบนเปเบเปเบญเบเบขเบนเปเปเบเปเปเบเบเบนเปเปเบเปเบเปเบญเบ.
ะฃ lock
syntax เบกเบตเบเบงเบฒเบกเปเบเบเปเบเบเบตเปเบซเบเปเบฒเบเบฐเบซเบฅเบฒเบเปเบ. เปเบเบฐเบเปเบฒเปเบซเปเปเบเป Monitor
เปเบเบเบเบปเบ [Richter] [Eric Lippert]. เบซเบเบถเปเบเปเบเบเบฑเปเบเปเบกเปเบ lock
เบชเบฐเปเบซเบกเบตเบญเบญเบเบเบฒเบ Monitor
, เปเบเบดเบเปเบกเปเบเบงเปเบฒเบกเบตเบเปเปเบเบปเบเปเบงเบฑเปเบ, เปเบเบเปเบฅเบฐเบเบตเบเบตเปเบเบฐเบเบนเปเบญเบทเปเบเบชเบฒเบกเบฒเบเบเปเบฝเบเบชเบฐเบเบฒเบเบฐเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบเบตเปเปเบเปเบฎเปเบงเบกเบเบฑเบเปเบเป. เปเบเบเปเบฅเบฐเบเบตเบเบฑเปเบเบเปเบฒเบง, เบกเบฑเบเบกเบฑเบเบเบฐเบเบตเบเบงเปเบฒเบเบตเปเบเบฐเปเบ deadlock เบซเบผเบท somehow เบขเบธเบเปเบเบเบเบฒเบเบขเปเบฒเบเบเบญเบเปเบ. เบเบงเบฒเบกเปเบเบเปเบเบญเบตเบเบญเบฑเบเบซเบเบถเปเบเปเบกเปเบเบงเปเบฒ Monitor เปเบเปเบเบฑเบ synchronization (SyncBlock
), เปเบเบดเปเบเบกเบตเบขเบนเปเปเบเบงเบฑเบเบเบธเบเบฑเบเบซเบกเบปเบ. เบเบฑเปเบเบเบฑเปเบ, เบเปเบฒเปเบฅเบทเบญเบเบงเบฑเบเบเบธเบเบตเปเบเปเปเปเบซเบกเบฒเบฐเบชเบปเบก, เปเบเบปเปเบฒเบชเบฒเบกเบฒเบเบเบทเบเบขเบธเบเปเบเปเบขเปเบฒเบเบเปเบฒเบเบเบฒเบ (เบเบปเบงเบขเปเบฒเบ, เบเปเบฒเปเบเบปเปเบฒเบฅเบฑเบญเบเปเบชเปเบชเบฒเบเบเบตเปเปเบเบทเปเบญเบกเบเปเป). เบเบงเบเปเบฎเบปเบฒเปเบเปเบงเบฑเบเบเบธเบเบตเปเปเบเบทเปเบญเบเปเบงเปเบชเบฐเปเบซเบกเบตเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบตเป.
เบฎเบนเบเปเบเบเบเบปเบงเปเบเบเบญเบเปเบเบทเปเบญเบเปเบเบเปเบงเบเปเบซเปเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบฐเบเบดเบเบฑเบเบเบงเบฒเบกเบเบฒเบเบซเบงเบฑเบเบเบญเบเบเบฒเบเปเบเบทเปเบญเบเปเบเบเบตเปเบชเบฑเบเบชเบปเบเบซเบผเบฒเบเบเบทเปเบ. เปเบ .NET, เบกเบฑเบเบเปเปเบเบปเบเบเปเบงเบ, เปเบเบเบงเบฒเบกเบเบดเบเปเบซเบฑเบเบเบญเบเบเปเบญเบ, เปเบเบฒเบฐเบงเปเบฒ เปเบเบเบฒเบเบเบดเบเบชเบฐเบเบต, เบเบงเบเบเบฐเบกเบตเบซเบผเบฒเบเปเปเบเบงเบขเบนเปเปเบเบเบปเบงเปเบเบซเบผเบฒเบ (เปเบเบฑเปเบเบเบฝเบงเบเบฑเบ Posix Threads), เปเบฅเบฐเบเปเปเปเบกเปเบเบขเบนเปเปเบเบซเบเบถเปเบ lok. เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบซเบเบถเปเบเบชเบฒเบกเบฒเบเปเบฎเบฑเบเปเบซเปเบเบงเบเปเบเบปเบฒเบชเปเบฒเบฅเบฑเบ philosophers เบเบฑเบเบซเบกเบปเบ. เปเบเปเปเบเบดเบเปเบกเปเบเบงเปเบฒเปเบเบฎเบนเบเปเบเบเบเบตเป, เบกเบฑเบเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเปเบฒเบเบซเบผเบธเบเบเปเบญเบเบฅเบฐเบซเบฑเบ.
เบเบฑเบเบเบฑเบเบเบฐเบเบฒเบซเบผเบฒเบเบเบปเบเบซเบผเบท async
/ await
เบเบปเบเบฅเบปเบ, เบเบฝเบงเบเบตเปเบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบเบฅเบฑเบญเบเบเบฐเบเบนเปเปเบเปเบขเปเบฒเบเบกเบตเบเบฐเบชเบดเบเบเบดเบเบฒเบ. เปเบเปเบเบฐเปเบเบฑเบเปเบเบงเปเบเบเปเบฒเบเบงเบเปเบฎเบปเบฒเบกเบตเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบซเบผเบฒเบ? 100? 10000? เบเบปเบงเบขเปเบฒเบ, เบเบงเบเปเบฎเบปเบฒเปเบเปเบฎเบฑเบเบเบฒเบเบฎเปเบญเบเบเป 100000 เบเบฑเบเปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบเปเบงเบฑเบเปเบเบเป. เบกเบฑเบเบเบฐเปเบเบฑเบ overhead เปเบเบทเปเบญเบชเปเบฒเบ thread เบชเปเบฒเบฅเบฑเบเปเบเปเบฅเบฐเบเปเบฒเบฎเปเบญเบเบเป, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒ เบซเบผเบฒเบเบเบฐเบเบนเปเบเบฐเบเปเปเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฐเบซเบเบฒเบ. เบเบฐเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฝเบเปเบเปเบซเบผเบฒเบเปเบเบปเปเบฒเบเบตเปเบกเบตเบซเบผเบฑเบเปเบซเบเบเบปเบ (เบเปเบฒเบเบฐเปเบเบปเปเบฒเบกเบต 4). เปเบฅเบฐเบเบปเบเบญเบทเปเบเบเบฝเบเปเบเปเบเบฐเปเบญเบปเบฒเบเบฑเบเบเบฐเบเบฒเบเบญเบเปเบ. เบซเบเบถเปเบเปเบเบเบฒเบเปเบเปเปเบเบเบฑเบเบซเบฒเบเบตเปเปเบกเปเบเบฎเบนเบเปเบเบ async / เบฅเปเบเปเบฒ. เบเบงเบฒเบกเบเบดเบเบเบญเบเบกเบฑเบเปเบกเปเบเบงเปเบฒเบซเบเปเบฒเบเบตเปเบเปเปเบเบทเบเบฐเบเบนเปเบเปเบฒเบกเบฑเบเบเปเบญเบเบเบฒเบเบฅเปเบเปเบฒเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเบเบตเปเบเบฐเบชเบทเบเบเปเป. เปเบฅเบฐเปเบกเบทเปเบญเบกเบฑเบเปเบฎเบฑเบเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบ, เบกเบฑเบเบชเบทเบเบเปเปเบเบฒเบเบเบฐเบเบดเบเบฑเบ (เปเบเปเบเปเปเบเปเบฒเปเบเบฑเบเบเปเบญเบเบขเบนเปเปเบเบเบฐเบเบนเปเบเบฝเบงเบเบฑเบ!). เปเบเบเปเบฅเบฐเบเบตเบเบญเบเบเบงเบเปเบฎเบปเบฒ, เบเบงเบเปเบฎเบปเบฒเบเบฐเบฅเปเบเปเบฒเบชเปเบฒเบฅเบฑเบเบชเปเบญเบก.
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
เปเบเปเบเบทเบเปเบเปเบเบฑเบเปเบเบทเปเบญเบเบเบฑเบเบเบญเบเบฅเบฑเบ tricky เบเบตเปเบเบฑเบเบเบตเบเบฑเบเบเบทเบเบเบฒเบเปเบเบเบญเบเบเบปเบ Task
. เบเปเบฒเบเบกเบฑเบ, เบเปเบฒเบเบชเบฒเบกเบฒเบเบฅเปเบเปเบฒเบเบฒเบเบชเปเบฒเปเบฅเบฑเบเบเบญเบเบงเบดเบเบตเบเบฒเบ, เบเบปเบเปเบฅเบตเบเบกเบฑเบ, เปเบฅเบฐเบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเบเบตเปเบเปเบฒเบเบชเบฒเบกเบฒเบเปเบฎเบฑเบเปเบเปเบเบฑเบ Task. เบเบฒเบเปเบเบงเบดเบเบตเบเบฒเบ, เปเบเบทเปเบญเบเบเบฑเบเบเบญเบเบฅเบฑเบเบเบงเบเบเบธเบกเบเบฒเบเบเบฐเบเบดเบเบฑเบ. เปเบชเบฑเปเบเบเบฒเบเบฅเบธเปเบกเปเบกเปเบเบงเปเบฒเบเปเบฒเบเปเปเบกเบตเบเบฒเบเบเบฑเบเบเปเบฒ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเปเบกเปเบ synchronous, เปเบฅเบฐเบเปเบฒเบกเบต, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบฐเบเบนเปเบเบทเบเบเปเบญเบเบญเบญเบเบกเบฒ. เบชเปเบฒเบฅเบฑเบเบเบงเบฒเบกเปเบเบปเปเบฒเปเบเบเบตเปเบเบตเบเบงเปเบฒเบเบตเป, เบกเบฑเบเบเปเปเบเบตเบเบงเปเบฒเบเบตเปเบเบฐเปเบเบดเปเบเปเบเบทเปเบญเบเบเบฑเบเบเบญเบเบฅเบฑเบเบเบตเป. เบเปเบฒเบเบชเบฒเบกเบฒเบเบชเปเบฒเบเบเปเบญเบเปเบชเปเบเบฒเบเปเบซเบผเบปเปเบฒเบเบตเป async
/ await
เบงเบดเบเบตเบเบฒเบ.
เปเบซเปเบเบปเบเบชเบญเบ. เบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบญเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒ 100 เบเบปเบเปเบเปเบเบทเปเบญเบเบเบฑเบเบเบตเปเบกเบต 4 เบซเบผเบฑเบเปเบซเบเบเบปเบ, 8 เบงเบดเบเบฒเบเบต. เบเบฒเบเปเบเปเปเบเบเบตเปเบเปเบฒเบเบกเบฒเบเบฑเบ Monitor เบเบฝเบเปเบเปเปเบฅเปเบ 4 threads เบเปเบฒเบญเบดเบเปเบฅเบฐเบชเปเบงเบเบเบตเปเปเบซเบผเบทเบญเบเปเปเปเบเปเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฑเบเบซเบกเบปเบ. เปเบเปเบฅเบฐเบเบฐเบเบนเป 4 เบญเบฑเบเบเบตเปเบเปเปเบกเบตเปเบงเบฅเบฒเบเบฐเบกเบฒเบ 2ms. เปเบฅเบฐเบเบฒเบเปเบเปเปเบ async / awai เปเบฅเปเบเบเบฑเบเบซเบกเบปเบ 100, เบเปเบงเบเบเบฒเบเบฅเปเบเปเบฒเปเบเบเบชเบฐเปเบฅเปเบ 6.8 เบงเบดเบเบฒเบเบตเปเบเปเบฅเบฐเบเบปเบ. เปเบเปเบเบญเบ, เปเบเบฅเบฐเบเบปเบเบเบตเปเปเบเปเบเบดเบ, idle เบชเปเบฒเบฅเบฑเบ 6 เบงเบดเบเบฒเบเบตเปเบกเปเบเบเปเปเบชเบฒเบกเบฒเบเบเบญเบกเบฎเบฑเบเปเบเปเปเบฅเบฐเบกเบฑเบเบเบตเบเบงเปเบฒเบเบตเปเบเบฐเบเปเปเบเปเบฒเปเบเบตเบเบเบฒเบเบฎเปเบญเบเบเปเบเปเบฒเบเบงเบเบซเบผเบฒเบเปเบเบฑเปเบเบเบตเป. เบเบฒเบเปเบเปเปเบเบเบฑเบ Monitor เปเบเปเบเบฒเบเปเบเบฑเบเบเปเปเบชเบฒเบกเบฒเบเบเบฐเบซเบเบฒเบเปเบเปเบเบฑเบเบซเบกเบปเบ.
เบชเบฐเบซเบฅเบธเบ
เบเบฑเปเบเบเบตเปเปเบเบปเปเบฒเบชเบฒเบกเบฒเบเปเบซเบฑเบเปเบเปเบเบฒเบเบเบปเบงเบขเปเบฒเบเบเปเบญเบเปเปเบซเบผเบปเปเบฒเบเบตเป, .NET เบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบเปเบเบเบชเปเบฒเบ synchronization เบซเบผเบฒเบ. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบกเบฑเบเบเปเปเปเบกเปเบเบชเบดเปเบเบเบตเปเบเบฐเปเบเปเบเบชเบฐเปเบซเบกเบตเบงเบดเบเบตเบเบฒเบเบเปเบฒเปเบเปเบเบงเบเบกเบฑเบ. เบเปเบญเบเบซเบงเบฑเบเบงเปเบฒเบเบปเบเบเบงเบฒเบกเบเบตเปเปเบเบฑเบเบเบฐเปเบซเบเบ. เบชเปเบฒเบฅเบฑเบเปเบเบเบฑเบเบเบธเบเบฑเบ, เบเบตเปเปเบกเปเบเบเบธเบเบเบปเบ, เปเบเปเบเบฑเบเบกเบตเบชเบดเปเบเบเบตเปเบซเบเปเบฒเบชเบปเบเปเบเบซเบผเบฒเบเบเบตเปเบเบฑเบเปเบซเบผเบทเบญ, เบเบปเบงเบขเปเบฒเบเปเบเบฑเปเบ: เบเบฒเบเปเบเบฑเบเบเบฐเบเบนเปเบเบตเปเบเบญเบเปเบ, TPL Dataflow, เบเบฒเบเบเบฝเบเปเบเบผเปเบเบผเบก Reactive, เบฎเบนเบเปเบเบเบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐเบเปเบฒเบเบญเบเปเบง, เปเบฅเบฐเบญเบทเปเบเป.
เปเบซเบผเปเบเบเปเปเบกเบนเบ
- เบเบฒเบเบชเบฐเปเบเบเบเบฒเบเบเบฐเปเบช:
Concurrency Visualizer - MSDN:
เบเบฐเบเบนเป ,เบฎเบนเบเปเบเบเบเบฒเบเบเบฝเบเปเบเบฅเปเบเบฅเบก Asynchronous เปเบฅเบฐเบญเบทเปเบเป เบเบฃ. - [Richter] - CLR เบเปเบฒเบ C#, Jeffrey Richter
- [Eric Lippert] -
เบเปเบฝเบงเบเบฑเบเบเบฒเบเบฅเบฑเบญเบ เบฅเบฐเบซเบฑเบเปเบซเบผเปเบเบเปเปเบกเบนเบ - เบฎเบนเบเบเบฒเบ - "เปเบเบฑเปเบเบฅเปเบฒเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบ", G. Semiradsky
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com