2016-09-02 2 views
3

Учитывая логическое б и Потокобезопасная функцию f(), который возвращает логическое значение, является следующее утверждение потокобезопасной:"b &= f();" в потоковом режиме, если "f()" является потокобезопасным?

b &= f(); 

Идея состоит в несколько потоков выполняются параллельно этим утверждением. Если один из них имеет f, возвращающий false, b должен быть ложным. В противном случае b истинно.

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

Гарантировано, что данный поток, сначала запустить f(), а затем читать b, а затем применить &?

+4

Если несколько потоков изменяют 'b', вам необходимо синхронизировать доступ. –

+0

'&' не является особенным. a = что-то (а) всегда великолепен. Здесь что-то (a) => a & f(). – usr

ответ

4

Нет; нет никакой гарантии, что вы получите правильный результат:

  1. Первый поток считывает b (который true)
  2. Второй поток читает b (который true)
  3. Первый поток выполняет b & f() (и нашел его true)
  4. Второй поток выполняет b & f() (и нашел его false)
  5. Второй поток записывает b назад (b является false)
  6. Первый поток записывает b назад (и, наконец, b является true)

так что вы должны синхронизировать в плане доступа

1

Простой ответ: нет. Причина этого заключается в том, что необходимо получить значение b. Если поток A сохраняет значение и прерывается потоком b, который получает b и выполняет f, тогда выполнение вашего первого потока будет работать с неправильным значением.

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

  • Нет связанных вопросов^_^