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

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

Голосование
Вопрос: Приходилось ли использовать мутексы в своих прогах?
Да, постоянно - 6 (23.1%)
Иногда - 14 (53.8%)
Ни разу - 4 (15.4%)
Они вообще не нужны - 1 (3.8%)
А что это? - 1 (3.8%)
Всего голосов: 5

Страниц: [1]   Вниз
  Печать  
Автор Тема: Мутексы: в чем сила, брат?  (Прочитано 7149 раз)
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


Просмотр профиля
« : Сентябрь 15, 2007, 23:49 »

Собственно, интересует целесообразность данной конструкции (в Qt)
Записан

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 не волк, в лес не уйдёт
Tonal
Гость
« Ответ #1 : Сентябрь 16, 2007, 09:03 »

Мутексы - один из базовых примитивов синхронизации.
Любая библиотека поддерживающая многопоточность должна предоставлять набор таких примитивов либо поираться на системные.

Так что, если не используешь потоки - то и мутексы тебе не нужны. Если используешь - без них никуда. ;-)

Вот здесь очень доходчиво: http://tula.bofh.ru/articles/184
Записан
Gryz
Гость
« Ответ #2 : Сентябрь 17, 2007, 11:45 »

Собственно, интересует целесообразность данной конструкции (в Qt)
А альтернативы?
Записан
Dodge
Гость
« Ответ #3 : Сентябрь 17, 2007, 12:18 »

Собсна сила в удобстве.
Вот примеры из мануалов Qt4.3:

Класс QMutex
Код:
 int complexFunction(int flag)
 {
     mutex.lock();

     int retVal = 0;

     switch (flag) {
     case 0:
     case 1:
         mutex.unlock();
         return moreComplexFunction(flag);
/* Вот тут на мой взгляд "косяк"
если например moreComplexFunction nothreadsafe, то смысл мутекса в этой функции теряется, по этому я бы zделал так:
...
     case 1:
         retVal = moreComplexFunction(flag);
         mutex.unlock();
         return retVal;
...
но это мелочь  :)
*/
     case 2:
         {
             int status = anotherFunction();
             if (status < 0) {
                 mutex.unlock();
                 return -2;
             }
             retVal = status + flag;
         }
         break;
     default:
         if (flag > 10) {
             mutex.unlock();
             return -1;
         }
         break;
     }

     mutex.unlock();
     return retVal;
 }

И мега удобный класс QMutexLocker
Код:
 int complexFunction(int flag)
 {
     QMutexLocker locker(&mutex);

     int retVal = 0;

     switch (flag) {
     case 0:
     case 1:
         return moreComplexFunction(flag);
     case 2:
         {
             int status = anotherFunction();
             if (status < 0)
                 return -2;
             retVal = status + flag;
         }
         break;
     default:
         if (flag > 10)
             return -1;
         break;
     }

     return retVal;
 }

Вопросы есть?  Подмигивающий

З.Ы.  Непонимающий Смысл опроса вообще не понятен...
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


Просмотр профиля
« Ответ #4 : Сентябрь 17, 2007, 12:25 »

Да надо было как то сделать программу с тредами.
Спросил вот у знакомых программеров недавно - чем они пользуются для подобного?
Оказалось, что половина народу вообще про мутексы даже не слышала... Юзают статические локи.
Записан

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 не волк, в лес не уйдёт
Gryz
Гость
« Ответ #5 : Сентябрь 17, 2007, 12:32 »

Да надо было как то сделать программу с тредами.
Спросил вот у знакомых программеров недавно - чем они пользуются для подобного?
Оказалось, что половина народу вообще про мутексы даже не слышала... Юзают статические локи.
Т.е. например статический int? это зло. не гарантируется атомарность операций блокировки и проверки блокировки. С большой вероятностью будет работать, но...
Записан
Tonal
Гость
« Ответ #6 : Сентябрь 17, 2007, 13:13 »

Спросил вот у знакомых программеров недавно - чем они пользуются для подобного?
Оказалось, что половина народу вообще про мутексы даже не слышала... Юзают статические локи.
Дикие люди, дети гор... (с)

А что такое "статические локи"?
Если обычная статическая переменная, то даже на однопроцессорной машине вполне просто нарваться на неприятности.
Вот примитивный код:
Код:
//C++
void func(/*...*/) {
  static bool lock = false;
  if (!lock) {
    lock = true;
    //work to data
    lock = false;
  }
}
Пусть 2 потока пытаются выполнить эту функцию.
Стратегия облома:
1) Первый поток проверяет условие - истина.
2) Система переключается на второй поток
3) Второй поток проверяет условие -  истина.
4) оба потока одновременно выполняют код в "защищённой" области.

Если if (!lock) заменить на mutex.lock(), или ещё лучше, на QMutexLocker (как писал Dodge) система гарантирует что блок будет выполнятся только в одном треде.
Записан
vaprele07
Гость
« Ответ #7 : Сентябрь 17, 2007, 13:24 »

близко:
Цитировать
Брюс Эккель признался в бессилии

Я первый признаЮсь, что не смогу написать корректную мультипоточную программу ни на C++, ни на Java, несмотря на годы, которые я провел, обучая тысячи людей этим языкам программирования. Это за пределами моих возможностей.
Что уж говорить об "обычных программистах на C++"?
Записан
fightcat
Гость
« Ответ #8 : Сентябрь 17, 2007, 15:23 »

Присоединяюсь к общему мнению - без них - никуда Улыбающийся
Мьютексы - аттрибут не библиотеки, а стиля программирования. Если код ориентирован на многопоточность, то мьютексы необходимы, а следовательно какой бы библиотекой Вы не пользовались, придется либо брать реализацию мьютексов этой библиотеки, либо пользоваться нативными, либо, для маньяков, писать свои Улыбающийся
Записан
Deiv
Гость
« Ответ #9 : Сентябрь 17, 2007, 15:44 »

Да, при мультитредовой программе где треды работают с общими блоками данных без них никуда.
Иначе сегфолта или каши в данных тебе не избежать, к сожалению выяснено на собственном опыте.
Правда писал без qt, просто на плюсах.
Записан
ритт
Гость
« Ответ #10 : Сентябрь 18, 2007, 02:33 »

мутексы - это хорошо Улыбающийся

если кто не знает, есть замечательный проект qtconcurrent, позволяющий совсем ленивым и невнимательным писать качественные многонитевые приложения, даже понятия не имея о мутексах

например:
Код:
QImage scaled(const QImage &image)
{
    return image.scaled(QSize(100, 100));
}

...

const QList<QImage> images = ...
const QList<QImage> thumbnails = QtConcurrent::mapped(images, scaled);
сгенерит список тумбнэилов из исходного списка изображений, используя нити

разработчики обещают, что qtconcurrent в обозримом будущем войдёт в стабильную ветку Qt

зы: брюсу эккелю пригодилось бы!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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