![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
georain |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
В многопоточном приложении есть переменная состояния bool с блокировками при её установке и чтении, например так:
Будет ли что-то страшное если убрать блокировку? Честно говоря я не вижу смысла её тут ставить. P.S. Поделитесь опытом работы с bool типами в многопоточности. Тут вроде не происходит чтения перед записью, только запись, а запись происходит как бы одной операцией, что может поломаться то (если рядом с установкой/чтением больше ничего нет), зачем блокировать? Это сообщение отредактировал(а) georain - 11.6.2008, 00:12 |
||||||
|
|||||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
bool не чем не отличаеться от обычных переменных типа int, кроме того что принимает только два значения - true, false.
Если к переменной, доступ получают несколько потоков, тогда блокировка необходима. Это сообщение отредактировал(а) andrew_121 - 11.6.2008, 00:53 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Это я уже слышал, меня интересует почему? Что случится если блокировки не будет? (только применительно к bool) Моё понимание что происходит с int: В одно и тоже время один поток хочет увеличить int на 5, другой тоже хочет увеличить int на 10. С блокировкой: они последовательно увеличивают int (пока один делает операции, второй ожидает), в итоге int увеличивается на 15. Без блокировки: первый поток читает int из памяти и заносит в регистр ЦП, второй делает тоже самое, первый поток увеличивает это значение на 5 (в регистре ЦП), второй делает тоже самое на 10, первый поток записывает int в память, второй делает тоже самое, в итоге в памяти оказывается значение одного из двух регистров. Мало того что int увеличился не на 15 а на 10 или 5, непонятно на 5 или на 10 он увеличился ![]() А с bool то что будет? Это сообщение отредактировал(а) georain - 11.6.2008, 00:15 |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
boob - принимает только два значения - true, false.
Допустим, один поток хочет получить значение переменной, а другой, в это же время, изменить. Что произойдет без блокировки? Секёшь? Примерчик:
Это сообщение отредактировал(а) andrew_121 - 11.6.2008, 01:16 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Нет не секу, расскажи.
|
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Это сообщение отредактировал(а) andrew_121 - 11.6.2008, 01:32 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
||||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
А вот тут тебе нужно позаботиться о синхронизации.
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Добавление блокировок в твой пример ничего не даст, а "позаботится о синхронизации" имхо означает создание полезного кода из бесполезного примера.
andrew_121, давай прервём нашу беседу до прихода специалистов. Добавлено через 13 минут и 23 секунды ИМХО, при использовании bool блокировать нужно только в конструкции
и производных от неё. Все остальные случаи представляют собой только а) чтение и б) запись без предварительного чтения, а значит не нуждаются в синхронизации. Я могу быть не прав! Поправьте меня аргументами или примерами Это сообщение отредактировал(а) georain - 11.6.2008, 01:46 |
|||
|
||||
Palladin |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 932 Регистрация: 15.5.2007 Где: Беларусь г.Гомель Репутация: нет Всего: 17 |
Не видете смысла, не ставьте, если смысл появится вы, по всей видимости, это поймете и сделаете, то что нужно! Не ждите "специалистов", какие гарантии что их ответ верен? Не полагайтесь на истину авторитета, полагайтесь на авторитет истины ![]() P.S. Слушать кого-то нужно лишь в случае когда надо срочно что-то делать, а вы незнаете как, сейчас по всей видимости вы изучаете, а значит изучайте ![]() Добавлено через 2 минуты и 36 секунд И не зачем грубить форумчанам, если вы не заметили andrew_121, изо всех сил старался помочь... -------------------- Глуп тот кто полагается на истину авторитета, а не на авторитет истины [color=red]KAV&KIS==Evil[/color] |
|||
|
||||
Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
bool - атомарный тип, причем значение ему обычно присваивается, не прибавляется, не вычитается и тд... так что можно без блокировок обойтись..
блокировать нужно немного по другому
если здесь не блокировать то код может выполнится 2 раза и более в принципе могут портиться даже переменные атомарных типов, если они изменяются одновременно из разных потокв, но поскольку для bool актуально только присваивание и сравнение, то тут
можно вообще не блокировать.. |
||||||
|
|||||||
georain |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Я ни в коем случае не хотел нагрубить, andrew_121, если я вас обидел, сильно прошу прощения. Я благодарен за вашу помощь, она навела на правильные мысли ![]() Lazin, спасибо! Т.е. в случае:
блокировать где-либо не надо? А таком случае:
в "другом" потоке (с if) блокировать тоже не надо? |
||||||
|
|||||||
Palladin |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 932 Регистрация: 15.5.2007 Где: Беларусь г.Гомель Репутация: нет Всего: 17 |
Вы видимо про else данного иф, ненадо
-------------------- Глуп тот кто полагается на истину авторитета, а не на авторитет истины [color=red]KAV&KIS==Evil[/color] |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
если операция сравнения и присваивания для инт атомарна, тоесть переключение контекста не может произойти во время операции с этим типом, то не надо..
но если операция не атомарна, то она может выполняться так: в случае одного потока: __________________________________________ var == 10 копирование в регистр из памяти значения переменной reg = var; reg == 10 изменение значения reg += 10 копировани из регистра в память var = reg var == 20 2 потока: 1й поток 2й поток __________________________________________________________________________________ var == 10 копирование в регистр из памяти значения переменной reg1 = var копирование в регистр из памяти значения переменной reg2 = var; reg2 == 10 изменение значения reg2 += var копирование из регистра в память var = reg2; var == 20 изменение значения в регистре (оно не учитывает изменения внесенные 2-м потоком) reg1 += 10; reg1 == 20 копирование из регистра в память var = reg1; var == 20!! var == 20 Добавлено @ 09:44 конечно шансов что так произойдет мало.. и в большинстве случаев в переменную запишется значение 30, но все-же проще все-же разрабатывать систему блокировок на уровне классов.. для разных объектов должны быть свои блокировки, вот так, на уровне кода очень сложно это делать.. я обычно использую блокировки вот так:
lock_write - блокировка изменения объекта - shared read lock_read_and_write - блокировка записи и чтения - exclusive write Это сообщение отредактировал(а) Lazin - 11.6.2008, 09:45 |
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Картина становится ясна. А операции "чтение" и "запись (без предварительного чтения в регистр)" всегда атомарны? Переключение контекста может произойти во время этих операций? Т.е. например в памяти находится 01, первый поток хочет записать 10, а второй поток в это время читает, может он в итоге прочитать 11 или 00, или всегда либо 01 либо 10?
Это сообщение отредактировал(а) georain - 11.6.2008, 09:55 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |