Russian Qt Forum
Ноябрь 26, 2024, 16:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Потокобезопасность простой операции  (Прочитано 10450 раз)
spectre71
Гость
« Ответ #15 : Декабрь 03, 2009, 12:34 »

Спасибо за ответы. Как я понял, все считают что начальный текст НЕ потокобезопасен. Бог с ними с  определениями, хотелось бы узнать: чем мне это гроэит? Я завалю нитку? Вылечу? Разумеется я обнуляю theSum перед запуском ниток и читаю ее только после того как все нитки завершены (в нитках только добавляю в нее).

Другими словами, во что выльется неудобоваримое "непотокобезопасно!"?

В результате "гонок":
a) можно получить "мусор" в theSum.red
b) можно считать не правильное значение из  theSum.red
Записан
Alp
Гость
« Ответ #16 : Декабрь 03, 2009, 12:50 »

x += y раскрывается в x = x+y

Для двух потоков:
1. Поток0: Вычисляется x + y0 (=x')
2. Поток1: Вычисляется x + y1 (=x'')
3. Поток0: x = x'
4. Поток1: x = x''

В итоге теряется первое присвоение. Я не в курсе что там насчет атомарности суммирования флоатов, может и в них ошибка набежать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Декабрь 03, 2009, 13:27 »

x += y раскрывается в x = x+y
Это правильно "по существу" но код в обоих случаях разный (это не макрос который раскрывается)

Происходит следующее

1) theSum.red и color.red принимаются на регистры (может только theSum.red)
2) выполняется сложение, результат в регистре
3) содержимое регистра записывается в theSum.red

Если не принимать мер, это не работает правильно с 2-мя и более нитками, т.к. др. нитка может "вклиниться" между 1 и 3.

Я выбрал такой способ решения (за счет усложнения кода)
Код:
struct ARGB {
  float alpha, red, green, blue;
};

ARGB theSum[MAX_NUM_THREAD];  // глобальная переменная
....

void ThreadFunc( void * data )   // рабочая ф-ция нитки
{
  ...
  ARGB color;
  EvalColor(&color);
  ...
  theSum[data->threadIndex].red += color.red;
  ...
}
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #18 : Декабрь 03, 2009, 16:44 »

>>x += y раскрывается в x = x+y
как сказал Igors, это просто логическое раскрытие. Это самостоятельный оператор.
Посмотри описание классов Qt API, в некоторых увидишь перегрузку такого оператора "+=" (или подобного, например "&=").
Записан

Юра.
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 23.