Использование массива с несколькими потоками читателя + писатель - PullRequest
3 голосов
/ 11 августа 2010

Я не уверен в этом ..

Использование массива int []. Если в моем приложении поток A читает, в то время как поток B записывает в тот же элемент массива, все будет удерживаться?

Я бы предпочел не иметь синхронизированный блок при чтении - это используется в веб-службе, поэтому я не смогу обслуживать несколько клиентов параллельно.

Спасибо.

Olivier

Ответы [ 5 ]

1 голос
/ 11 августа 2010

Если вы читаете больше, чем пишете, используйте ReaderWriterLockSlim для повышения производительности (хотя это, вероятно, сделает ваш код более многословным).

Если вы беспокоитесь о блокировке своих клиентских потоков, то, возможно, вы можете поставить эти операции в очередь в потокобезопасную очередь. Честно говоря, если только вы не берете несколько блокировок для каждого запроса, вам вряд ли придется ждать достаточно долго при входе в эти блокировки, чтобы пользователь-пользователь вашего сайта мог это заметить. Такое влияние на производительность является более значительным при работе с высокой пропускной способностью и низкой задержкой.

1 голос
/ 11 августа 2010

Нет, вам нужно использовать блок блокировки, чтобы никто не пытался прочитать массив, пока какой-то другой процесс пишет в него. В противном случае у вас могут возникнуть проблемы.

Это на самом деле довольно просто в C #, вы можете просто сделать это:

// declare an object to use for locking
Object lockObj = new Object();

// declare the array
int[] x = new int[5];

// set the array value (thread safe operation)
public void SetArrayVal(int ndx, int val)
{
    if (ndx < 0 || ndx >= x.Length)
    {
        throw new ArgumentException("ndx was out of range", ndx);
    }    
    lock (lockObj )
    {
        x[ndx] = val;
    }
}

// get the array value (thread safe operation)
public int GetVal(int ndx)
{
    if (ndx < 0 || ndx >= x.Length)
    {
        throw new ArgumentException("ndx was out of range", ndx);
    }    
    lock (lockObj )
    {
        return x[ndx];
    }
}

Я бы не стал так сильно беспокоиться о производительности, как о том, чтобы убедиться, что вы правильно настроили резкость, что очень важно.

0 голосов
/ 11 августа 2010

Вам нужно заблокировать доступ к вашему массиву из нескольких параллельных потоков.Самый простой способ - разрешить доступ к вашему массиву только с помощью методов получения / установки, а затем добавить в них некоторый код блокировки.

0 голосов
/ 11 августа 2010

Массивы не являются поточно-ориентированными при чтении и записи в многопоточных средах: http://msdn.microsoft.com/en-us/library/system.array.aspx

Вам придется заблокировать массив, a t1.Join ();t2.Join () может также работать, хотя я не уверен.

0 голосов
/ 11 августа 2010

Общие ресурсы, к которым имеют доступ несколько потоков, должны быть синхронизированы.

Поскольку массивы не являются поточно-ориентированными, вам нужно управлять этим самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...