2013-08-16 1 views
0

Моя программа имеет 2 потока и глобальную переменную int. Один поток читает эту переменную, а другой поток записывает эту переменную. Должен ли я использовать блокировку мьютекса в этой ситуации.Чтение глобальной переменной из потока и запись на эту переменную из другого потока

Эти функции выполняются из двух потоков одновременно и повторяются в моей программе.

void thread1() 
{ 
    if (condition1) 
     iVariable = 1; 
    else if (condition2) 
     iVariable = 2; 
} 

void thread2() 
{ 
    if (iVariable == 1) 
     //do something 
    else if (iVarable == 2) 
     //do another thing 

} 

ответ

1

Если вы не используете какую-либо синхронизацию, то это совершенно непредсказуемо, если второй поток видит обновленное значение. Это колеблется где-то между несколькими наносекундами и никогда. С никогда не бывает Исход, в частности, проблемный, конечно, это может произойти на процессоре x86, когда вы не объявляете переменную volatile и запускаете сборку выпуска вашей программы. Это может занять много времени на процессорах со слабой моделью памяти, например с ядрами ARM. Единственное, что вам не нужно беспокоиться, это увидеть частично обновленное значение, int Обновления являются атомарными.

Это все, что можно сказать о размещенном коде. Мелкозернистая блокировка редко работает хорошо.

+0

Скажем, thread1() назначит 1 для iVariable (скажем, старое значение iVariable равно 0). Одновременно функция thread2() оценивает выражение (iVariable == 1) внутри условия if. Я знаю, что логическое выражение, возвращаемое выражением (iVariable == 1), непредсказуемо. Но я хочу узнать, выполняется ли после выполнения функции thread1() значение iVariable1 равно 1 или другому значению мусора. – SRF

+0

Это единственное, о чем вам не о чем беспокоиться. Я упомянул в ответе. –

+0

Тогда не о чем беспокоиться. И нет смысла блокировать мьютексы, поскольку никакие значения мусора не будут назначены iVariable. – SRF

1

Да, вы должны (при большинстве обстоятельств). Мьютексы гарантируют, что защищенные данные будут правильно видны из нескольких конкурирующих процессоров. Если у вас нет проблемы с производительностью, вы должны использовать мьютекс. Если производительность является проблемой, посмотрите на блокированные структуры данных.

+1

Без мьютекса вокруг iVariable вполне возможно, что не все процессоры в многоядерной/процессорной системе будут видеть обновления, когда вы думаете, что это должно произойти. Некоторые из этих условий гонки видимости памяти могут быть сильно зависящими от машины. Итак, используйте мьютекс, блокировку спина или атомную переменную. –