1 | ||||||||||||||||
C++11. thread, mutex, thread-safety02.08.2016, 12:28. Показов 2360. Ответов 25
есть функция, которая стартует 2 потока: для отлова нажатия клавиш и для выполнения действий
Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
Является такая реализация потокобезопасной? Что можно исправить/улучшить?
0
|
|
02.08.2016, 12:28 | |
Ответы с готовыми решениями:
25
Ошибка при подключение <mutex> и <thread> Ошибка компиляции "no instance of constructor 'std::thread::thread' matches the argument list"
|
02.08.2016, 12:37 [ТС] | 4 |
так уж вышло, изначально использовал CreatheThread, затем _beginthreadex, а потом и вовсе посоветовали std::thread.
а вот винапишный мьютекс так и остался
0
|
Неэпический
|
|||||||||||||||||||||
02.08.2016, 12:45 | 5 | ||||||||||||||||||||
1
|
02.08.2016, 12:51 [ТС] | 6 | |||||||||||||||
Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
Вот так правильно будет? Добавлено через 2 минуты этот поток присоединен .join(); как только он завершится - программа закроется, соответственно и второй поток закроется, т.к. while(active), а active = false
0
|
Неэпический
|
||||||
02.08.2016, 12:51 | 7 | |||||
Также, если поток создать не удастся и вылетит исключение
1
|
02.08.2016, 12:57 [ТС] | 8 | ||||||||||
а вот это уже не предусмотрел
Добавлено через 2 минуты 1.создал приватное поле std::mutex hMutex 2.заменил
0
|
Неэпический
|
|
02.08.2016, 12:59 | 9 |
![]() Решение
А поток keyHandler отсоединен, ему абсолютно по барабану что стало с этим потоком.
Я написал один из возможных вариантов развития. Лучше используйте std::lock_guard, это защитит от исключений и упростит работу.
1
|
02.08.2016, 13:02 [ТС] | 10 | ||||||||||
т.е. после цикла ( перед выходом из потока ) нужно закрыть мьютекс?
Добавлено через 2 минуты т.е.
а закрывать нужно? т.е. unlock
0
|
02.08.2016, 13:06 | 11 |
Я бы всю логику по-другому организовал - по сути нужно просто реагировать на события клавиатуры, пусть поток, который слушает клавиатуру, формирует мессаджы/эвенты и кладет их в очередь, другой поток просто читает сообщения из очереди. Можно использовать std::condition_variable для ожидания новых сообщений, поток добавил сообщение в очередь - уведомил ожидающего. Ожидающий поток проснулся, обработал сообщения из очередь и опять уснул.
Добавлено через 40 секунд нет, lock_guard разлочит мьютекс при выходе из области видимости. Добавлено через 37 секунд но если нужно руками разлочить, то lock_guard тогда не нужен
1
|
02.08.2016, 13:14 [ТС] | 13 |
буду курить...
![]() сейчас посмотрел полностью на готовый код думал где бы что оптимизировать/отрефакторить и взгял упал на эту часть программы, к тому же клавиши бывает через раз отлавилваются, т.е. нажимаю KEY_MONEY(VK_F8) - ничего не происходит, нажму еще раз - сработает, возможно это из-за Sleep(50) в KeyHandling() Добавлено через 1 минуту
0
|
Неэпический
|
||||||
02.08.2016, 14:17 | 14 | |||||
Первое приближение:
2
|
02.08.2016, 14:18 [ТС] | 15 | |||||
не подошел.
т.к. в игре меня успевают убить при bGodMode=true, до того как возобновятся жизни
Добавлено через 44 секунды а вообще нужен ли здесь mutex? один поток изменяет значение двух bool, Другой поток на основе значений этих переменых выполняет перезапись данных AP,HP,ammo
0
|
Неэпический
|
||||||
02.08.2016, 14:26 | 20 | |||||
Можно еще упростить, убрав внутренний цикл:
Ты запускал? Там два цикла, если что ![]()
1
|
02.08.2016, 14:26 | |
Помогаю со студенческими работами здесь
20
Boost::thread vs std::thread Thread Thread Thread class Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |