Потокобезопасность lock(){ File.AppendText }
От: Аноним  
Дата: 06.01.11 06:28
Оценка:
Вот такая реализация, может ли File.AppendText по каким-то обстоятельствам зависнуть, тем самым создав deadlock ? По идее все операции IO имеют некий таймаут. Ситуацию когда при обращении к файлу зависнет драйвер думаю нет смылса смотреть, т.к. в этом случае придется перезагружать систему.

Какие-то может еще грабли есть от использования lock{} в этом случае ?


public class Log
{
   private static string m_LogFilename;
   private static object m_LogSync  = new object();

   public static void Write( string text )
   {
      lock( m_LogSync )
      {
         File.AppendText( m_LogFilename, text );
      }

   }
}
Re: Потокобезопасность lock(){ File.AppendText }
От: Аlexey  
Дата: 06.01.11 14:33
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Какие-то может еще грабли есть от использования lock{} в этом случае ?


Думаю основные грабли в том, что доступ к диску — потенциально долгая операция, даже без "зависания". Вы заставляете все свои потоки которые пишут в лог выстраиваться в очередь ожидая записи лога. Видимо более удачным решением было бы созданий очереди в памяти в которую скидываются сообщения и отдельного потока, который занимается переписыванием из очереди на диск. Естественно дотуп к очереди синхронизируется, но такой способ обеспечивает намного более высокуе степень паралелизма чем оборачивание доступа к диску в критическую секцию(lock).
Re: Потокобезопасность lock(){ File.AppendText }
От: rasp_file Украина  
Дата: 06.01.11 14:37
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Вот такая реализация, может ли File.AppendText по каким-то обстоятельствам зависнуть, тем самым создав deadlock ? По идее все операции IO имеют некий таймаут. Ситуацию когда при обращении к файлу зависнет драйвер думаю нет смылса смотреть, т.к. в этом случае придется перезагружать систему.


А>Какие-то может еще грабли есть от использования lock{} в этом случае ?


А>

А>public class Log
А>{
А>   private static string m_LogFilename;
А>   private static object m_LogSync  = new object();

А>   public static void Write( string text )
А>   {
А>      lock( m_LogSync )
А>      {
А>         File.AppendText( m_LogFilename, text );
А>      }

А>   }
А>}
А>


Почитайте про Asynchronous File I\O
... << RSDN@Home 1.2.0 alpha 4 rev. 1481>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.