Russian Qt Forum
Июля 01, 2025, 01:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Узнать какая QThread захватила QMutex  (Прочитано 9306 раз)
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.038 секунд. Запросов: 20.