Этот код безопасен? - PullRequest
       7

Этот код безопасен?

3 голосов
/ 07 февраля 2009

Я пишу некоторый код, где поток пользовательского интерфейса должен взаимодействовать с фоновым потоком, осуществляющим сетевое взаимодействие. Код работает, но будет ли он считаться потокобезопасным?

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

static Mutex^ mut_currentPage = gcnew Mutex;
static array<unsigned char>^ m_currentPage;

property array<unsigned char>^ Write
{
    void set(array<unsigned char>^ value) 
    {
        mut_currentPage->WaitOne();
        m_currentPage = value;
        mut_currentPage->ReleaseMutex();
    }
}

Это код .NET C ++ ...:)

Ответы [ 2 ]

4 голосов
/ 07 февраля 2009

Это выглядит поточно-ориентированным, но вы можете подумать об обработке исключений; установка поля не должна быть ошибкой (за исключением, возможно, ThreadAbortException), но если код был более сложным, вы должны убедиться, что вы освободили мьютекс при исключении.

Я бы тоже посмотрел на Monitor ("замок" в C #)

Еще одна мысль: даже если вы заблокируете доступ к полю, массив по своей природе изменчив. Попробуйте вместо этого использовать string, так как это неизменяемое?

3 голосов
/ 07 февраля 2009

Если вы используете потоки внутри процесса и хотите только взаимное исключение, используйте Monitor вместо Mutex - я считаю, что он более эффективен.

Это выглядит нормально - но вы также должны заблокировать, когда читает значение, иначе нечего сказать, что оно не будет устаревшим. Альтернатива состоит в том, чтобы сделать переменную volatile (по крайней мере, в C # - я не знаю, каков эквивалент в C ++ / CLI.)

...