2013-03-13 5 views
3

У меня есть переменная (cnt) внутри вложенной parallel.foreach. Я запускаю эту программу и, по-видимому, хорошо работает. Кто-нибудь знает, что этот код действительно потокобезопасен? Можно ли определить переменную внутри петель parallel?Локальная переменная внутри параллельных петель Безопасность резьбы

спасибо.

object obj = new object(); 
    int total=0; 

    Parallel.For(0, 2, i => 
    { 
     Parallel.For(0, 1000000, j => 
     { 
      int cnt = 0; 
      if ((arr[i, j] % 2) == 0) 
      { 
       Interlocked.Increment(ref cnt); 
      } 
      lock (obj) 
      { 
       total= total+ (cnt/2); 
      } 
     }); 
    }); 

ответ

6

Этот код поточно - только общие данные (total) правильно синхронизированы. Он потокобезопасен даже без использования Interlocked.Increment (то есть: до вашего редактирования).

Однако, это не .

Было бы лучше использовать перегрузку с помощью local initializer and finally delegates.

int total=0; 
Parallel.For(0, 2, 
{ 
    Parallel.For(0, 1000000, 
     local => 0, 
     (j, state, local) => 
      { 
        if ((arr[i, j] % 2) == 0) 
        { 
      ++local; 
        } 
     return local; 
    }, 
     local => Interlocked.Increment(ref total, local) 
    ); 
}); 
+0

10 colud, пожалуйста, скажите, как изменить его, чтобы стать эффективным – mohammad

+0

@mohammad Done. –

+0

Интересно, можете ли вы дать мне больше информации. К сожалению, я получаю эту ошибку Аргументы типа для метода 'System.Threading.Tasks.Parallel.For (int, int, System.Func , System.Func , System.Action ) 'не может быть выведено из использования. Попробуйте явно указать аргументы типа. – mohammad

0

Этот код действительно безопасен, поскольку инструкция lock действует как операция полного ограждения. Это гарантирует, что операция приращения атомарна и не будет подвержена гонкам из других потоков

+0

@pst блокировка необходима из-за использования 'total'. Он читается и записывается в том же заявлении. Без «блокировки» поток может быть прерван после чтения, но до записи, и, следовательно, в конечном итоге с данными racy – JaredPar

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