مسئله خواننده-نویسنده
دومین مسئله خواننده ها-نویسنده ها

راه حل اول بهترین راه حل نبود، زیرا این امکان وجود داشت که یک خواننده مثلاً R1 دارای قفل باشد، یک نویسنده مثلاً W منتظر قفل باشد و سپس یک خواننده مثلاً R2 درخواست دسترسی کند. منصفانه نیست که R2 به طور ناگهانی و قبل از W داخل شود؛ اگر این اتفاق به اندازه کافی رخ دهد، W دچار قطعی منبع خواهد شد. درست این است که W در اسرع وقت شروع شود. این امر انگیزه ای است برای راه حل مسئله دوم خواننده ها- نویسنده ها که در آن این محدودیت افزوده می‌شود که هیچ نویسنده‌ای، زمانی که به صف وارد شد، نباید بیش از حد ضروری منتظر بماند. به این راه حل، ارجحیت نویسندگان نیز گویند. یک راه حل برای سناریوی ارجحیت نویسندگان به شکل زیر است:
int readcount, writecount;                   //(initial value = 0)
semaphore rmutex, wmutex, readTry, resource; //(initial value = 1)

//READER
reader() {
<ENTRY Section>
  readTry.P();                 //Indicate a reader is trying to enter
  rmutex.P();                  //lock entry section to avoid race condition with other readers
  readcount++;                 //report yourself as a reader
  if (readcount == 1)          //checks if you are first reader
    resource.P();              //if you are first reader, lock  the resource
  rmutex.V();                  //release entry section for other readers
  readTry.V();                 //indicate you are done trying to access the resource

<CRITICAL Section>
//reading is performed

<EXIT Section>
  rmutex.P();                  //reserve exit section - avoids race condition with readers
  readcount--;                 //indicate you're leaving
  if (readcount == 0)          //checks if you are last reader leaving
    resource.V();              //if last, you must release the locked resource
  rmutex.V();                  //release exit section for other readers
}

//WRITER
writer() {
<ENTRY Section>
  wmutex.P();                  //reserve entry section for writers - avoids race conditions
  writecount++;                //report yourself as a writer entering
  if (writecount == 1)         //checks if you're first writer
    readTry.P();               //if you're first, then you must lock the readers out. Prevent them from trying to enter CS
  wmutex.V();                  //release entry section
  resource.P();                //reserve the resource for yourself - prevents other writers from simultaneously editing the shared resource
<CRITICAL Section>
  //writing is performed
  resource.V();                //release file

<EXIT Section>
  wmutex.P();                  //reserve exit section
  writecount--;                //indicate you're leaving
  if (writecount == 0)         //checks if you're the last writer
    readTry.V();               //if you're last writer, you must unlock the readers. Allows them to try enter CS for reading
  wmutex.V();                  //release exit section
}
در این روش ارجحیت به نویسندگان داده می شود، که با مجبور کردن هر خواننده برای قفل کردن و آزاد کردن سمافور readTry به صورت جداگانه میسر می شود. از سوی دیگر، نویسندگان مجبور نیستند که به طور جداگانه آن را قفل کنند. فقط اولین نویسنده readTry را قفل می کند، سپس تمام نویسنده های بعدی می توانند به سادگی و پس از آزاد شدن منبع توسط نویسنده قبلی از آن استفاده کنند. آخرین نویسنده باید سمافور را آزاد کند تا دروازه برای خواننده‌ها باز شود که بتوانند بخوانند.
اگر سمافور قبلاً توسط یک نویسنده ست شده باشد، هیچ خواننده ای نمی‌تواند درگیر بخش ورود شود. خواننده باید منتظر بماند تا آخرین نویسنده قفل منبع و سمافورهای readTry را باز کند. از سوی دیگر، اگر یک خواننده ی خاص سمافور را قفل کرده باشد، به هرگونه نویسنده ی هم روند بالقوه این علامت را می دهد که یک خواننده در بخش ورود قرار دارد. بنابراین، نویسنده منتظر می ماند تا خواننده readTry آزاد کند و سپس نویسنده بلافاصله آن را برای خودش و برای تمام نویسندگان بعدی قفل میکند. با این وجود، نویسنده قادر نخواهد بود تا زمانی که خواننده کنونی منبع را آزاد نکرده است، به منبع دسترسی پیدا کند و منبع زمانی آزاد می‌شود، که خواننده مذکور کارش با منبع در ناحیه بحرانی تمام شده باشد.
هم نویسنده و هم خواننده در منطقه ورود خود می توانند سمافور منبع را قفل کنند. البته برای انجام این کار، باید ابتدا سمافور readTry را قفل کنند که فقط یکی از آنها در هر لحظه می تواند این کار را انجام دهد. 
اگر هیچ نویسنده‌ای برای دسترسی به منبع وجود نداشته باشد (شرایطی که توسط وضعیت سمافور readTry به خواننده نشان داده می شود)، آنگاه خواننده‌ها منبع را قفل نخواهند کرد. این کار از این جهت انجام می‌شود تا به یک نویسنده اجازه داده شود تا بلافاصله و به محض اینکه خواننده کنونی خواندن را تمام کرد، کنترل منبع را به دست گیرد. در غیر این صورت، نویسنده مجبور خواهد بود تا منتظر صفی از خواننده ها بماند تا کارشان تمام شود و آخرین خواننده بتواند قفل سمافور readTry را باز کند. به محض اینکه یک نویسنده نمایان میشود سعی می‌کند تا readTry را ست کند و در آنجا متوقف می شود و منتظر می ماند تا خواننده کنونی readTry را آزاد کند. سپس، به محض اینکه خواننده کنونی خواندنش تمام شد، کنترل منبع را به دست می گیرد و و مانع از ورود تمام خواننده های بعدی خواهد شد. تمام خواننده های بعدی در سمافور readTry متوقف می شوند و منتظر می مانند تا نویسنده کارش با منبع تمام شود و با آزاد کردن readTry دروازه را باز کند.
اشیاء rmutex و wmutex دقیقاً مشابه با راه حل اول مورد استفاده قرار می‌گیرند. تنها هدف آن ها اجتناب از شرایط مسابقه ای بین خواننده ها و نویسنده ها است، که این شرایط رقابتی در بخش های ورودی یا خروجی آن ها به وجود می آید.