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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Узнать какая QThread захватила QMutex  (Прочитано 8872 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Февраль 17, 2016, 05:10 »

Добрый день

Не наблюдаю такого метода у QMutex. Можно ли реализовать его самому?

Спасибо
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Февраль 18, 2016, 08:15 »

Вот сделал так. Думаю наследование от QMutex неудачно, он для этого явно не предназначен, поэтому агрегатом
Код
C++ (Qt)
#ifndef CMUTEX_H
#define CMUTEX_H
 
#include <QMutex>
#include <QThread>
 
class CMutex {
public:
CMutex( void ) : mOwner(0) {}
 
void Lock( void )
{
mMutex.lock();
mOwner = QThread::currentThread();
}
 
void Unlock( void )
{
mOwner = 0;
mMutex.unlock();
}
 
QThread * GetOwner( void ) const
{
return mOwner;
}
 
private:
QThread * mOwner;
QMutex mMutex;
};
 
#endif // CMUTEX_H
 
Жаль что в Qt нет этого метода  Плачущий
« Последнее редактирование: Февраль 18, 2016, 13:12 от Igors » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #2 : Февраль 18, 2016, 10:13 »

С QMutexLocker не будет работать Грустный
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Февраль 18, 2016, 10:18 »

С QMutexLocker не будет работать Грустный
Да, и с наследованием тоже, поэтому лучше без него. Ну ничего, это я переживу.

А больше Вас ничего не смущает?  Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Февраль 18, 2016, 12:35 »

Да, и с наследованием тоже, поэтому лучше без него. Ну ничего, это я переживу.

А почему все-таки не наследоваться? Что противоречит? Ведь смысл тут расширить функционал, а не изменить.

А больше Вас ничего не смущает?  Улыбающийся

Вот это, например:

Код:
void GetOwner( void ) const
{
return mOwner;
}

не скомпилиццо...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Февраль 18, 2016, 13:16 »

Вот это, например:

Код:
void GetOwner( void ) const
{
return mOwner;
}

не скомпилиццо...
То опыска  Улыбающийся Исправил, спасибо

Но суть не в этом. Я удивлен - ожидал что немедленно укажут на мою безграмотность! Но.. ничего не произошло  Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Февраль 18, 2016, 13:31 »

Я бы, пожалуй, указал еще на то, что QMutex может быть параметризируемым. И дефолтное значение QMutex::RecursionMode = NonRecursive является далеко не всегда оптимальным, часто приходится создавать мутексы с QMutex::Recursive.

Ну и проверка на QThread::isFinished() в геттере, имхо, не помешала бы (например, тред остановился до Unlock - тогда по хорошему надо возращать 0).
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #7 : Февраль 18, 2016, 16:25 »

Я удивлен - ожидал что немедленно укажут на мою безграмотность! Но.. ничего не произошло  Улыбающийся
Подозреваю, между mMutex.lock() и mOwner = QThread::currentThread() текущий поток вполне может стать уже другим.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Февраль 18, 2016, 16:31 »

Подозреваю, между mMutex.lock() и mOwner = QThread::currentThread() текущий поток вполне может стать уже другим.

Каким образом? Мутекс то уже залочился. Другие потоки на этом месте стоят и ждут unlock().
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
poru
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #9 : Февраль 18, 2016, 16:43 »

А кому нужен метод GetOwner? В прочих участках программы мы всегда будем получать 0. А id владельца только в секции lock. Зачем вообще этот класс?  Улыбающийся
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #10 : Февраль 18, 2016, 22:54 »

Каким образом? Мутекс то уже залочился. Другие потоки на этом месте стоят и ждут unlock().
С чего это всем другим потокам ждать? Ждать будут только те потоки, которые будут пытать сделать lock, всем остальным потокам глубоко всё равно на этот мьютекс. Так что currentThread() в контексте CMutex::lock() в общем случае может не иметь ничего общего с тем потоком, из которого, собственно, и был вызван lock().
Записан
Bepec
Гость
« Ответ #11 : Февраль 18, 2016, 22:58 »

currentThread вроде бы отдаёт id потока, в котором находится объект/исполняется функция.
А другие потоки не могут залочить мутекс пока его не отпустит этот поток.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Февраль 19, 2016, 07:00 »

Общее правило: если есть хоть один "пишущий" (переменная изменяется), то ВСЕ обращения к этой переменной, как по записи, так и по ЧТЕНИЮ) должны быть защищены. В данном случае GetOwner (чтение) не защищено
Код
C++ (Qt)
// Thread 1
if (mutex.GetOwner() == someValue)
.. <- пробой
 
// Thread  2
mOwner = QThread::currentThread();  // в методе CMutex::Lock
 
В точке "пробой" возвращенное значение запросто может быть изменено др ниткой (Thread 2)

Это некорректно (и безграмотно). Тут легко найти "подтверждения". Напр "так вот почему великие "тролли" не сделали этот метод!"  Казалось бы - все, мой жалкий велик никуда не годится  Плачущий  И можно "опускать занавес"

Или.. мы чего-то не учли?  Улыбающийся
Записан
Bepec
Гость
« Ответ #13 : Февраль 19, 2016, 16:59 »

Всем просто пофиг на вашу ловушку Веселый
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #14 : Февраль 19, 2016, 19:28 »

Ждать будут только те потоки, которые будут пытать сделать lock, всем остальным потокам глубоко всё равно на этот мьютекс. Так что currentThread() в контексте CMutex::lock() в общем случае может не иметь ничего общего с тем потоком, из которого, собственно, и был вызван lock().

Правильно, поэтому только поток, который смог сделать lock(), продвинется дальше и вернет себя в currentThread().
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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