2013-07-04 7 views
1

Что я хочу сделать, так это получить доступ к List на несколько потоков. Это потокобезопасно, поэтому я могу просто сделать это без забот. Единственная проблема в том, что иногда я должен изменить List. Поэтому я хочу, чтобы другие потоки не использовали List только при его изменении.Доступ и модификация одновременного доступа к потоку

Это то, о чем я думаю, есть ли лучший способ?

volatile bool isReading = false; 
volatile bool isWriting = false; 
object o = new object(); 
public void StartRead() 
{ 
    lock (o) 
    { 
     while (isWriting || isReading) ; 
     isReading = true; 
    } 
} 
public void StopRead() 
{ 
    isReading = false; 
} 
public void StartWrite() 
{ 
    lock (o) 
    { 
     while (isReading) ; 
     isWriting = true; 
    } 
} 
public void StopWrite() 
{ 
    isWriting = false; 
} 

ответ

3

Лучшим решением было бы использовать ReaderWriterLockSlim. Это позволит вам иметь много читателей одновременно, но только блокировать его, когда у вас есть писатель.

http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

Это действительно зависит от того, сколько раздора есть для замка, хотя. В ситуациях с низким уровнем конкуренции, lock будет работать аналогично ReaderWriterLockSlim - ссылка When is ReaderWriterLockSlim better than a simple lock?.

Существует много возможных решений этого вопроса, в зависимости от множества особенностей того, как он используется. Но в упрощенном случае «взято по номиналу» ReaderWriterLockSlim является достойным решением. Если он не работает для вас после профилирования производительности, могут потребоваться другие решения, которые учитывают ваши конкретные сценарии использования.

+0

Отлично! Я не понимал, что в System.Threading так много. – Jay

Смежные вопросы