گزينه 4 نیمه درست است! (گزینه سنجش 4 است).
فرض کنید n=4 باشد. بنابراین 4 فرایند P0، P1، P2 و P3 داریم. حال فرض کنید تا کنون هیچ فرایندی قصد ورود به ناحیه بحرانی را نداشته است و در شروع داستان، waiting[0] تا waiting[3] و key و lock همگی 0 هستند. حال فرایند P1 میخواهد وارد ناحیه بحرانی شود (i=1). waiting[1] را true (1) و key=1 میکند و وارد حلقه while میشود و چون lock=0 است با test_and_set یا TSL موفق میشود که key را 0 و lock را 1 کند و از حلقه while (busy waiting) به دلیل صفر بودن key خلاص شود و waiting[1] را false (0) کند و وارد ناحیه بحرانی شود. حال فرض کنید این فرایند از ناحیه بحرانی خارج میشود و هیچ فرایندی در این میان قصد ورود به ناحیه بحرانی را نداشته است. P1 بعد از خروج از ناحیه بحرانی، ابتدا j=(1+1)%4=2 گذاشته و وارد حلقه while میشود و همین جا گرفتار میشود چون waiting[j] برای j=2,3,0,1,2,3,0,1,2,3,… صفر (false) است و !waiting[j] برابر true. پس تا همین جا این روش غلط است و گذشته از شروط انحصار متقابل و انتظار محدود و پیشرفت، طرف از ناحیه بحرانی خارج شده و گیر کرده و حتی نمیتواند وارد ناحیه غیربحرانی خود شود! (این راه حل نیست که بخواهیم در مورد نقض شروط صحبت کنیم!). P1 آنقدر در حلقه میچرخد تا یک فرایند دیگر مثلاً P3 بخواهد وارد ناحیه بحرانی شود. دراین صورت چون P3 نیز waiting[3] را true کرده و در حلقه busy waiting بالا به دلیل 1 بودن lock گرفتار شده است، فرایند P1 میتواند از حلقه while(!waiting[j]) خارج شود در حالی که j=3 است و چون j==i غلط است lock را false نمیکند و وارد ناحیه غیربحرانی خود میشود و با اینکه P1 در ناحیه غیر بحرانی است جلوی ورود P3 به ناحیه بحرانی را گرفته است و به همین دلیل طراح گزینه 4 را انتخاب کرده است (نقض شرط پیشرفت). حتی برای n=2 هم این مسئله اتفاق میافتد.