Russian Qt Forum

Qt => Общие вопросы => Тема начата: Racheengel от Сентябрь 15, 2007, 23:49



Название: Мутексы: в чем сила, брат?
Отправлено: Racheengel от Сентябрь 15, 2007, 23:49
Собственно, интересует целесообразность данной конструкции (в Qt)


Название: Re: Мутексы: в чем сила, брат?
Отправлено: Tonal от Сентябрь 16, 2007, 09:03
Мутексы - один из базовых примитивов синхронизации.
Любая библиотека поддерживающая многопоточность должна предоставлять набор таких примитивов либо поираться на системные.

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

Вот здесь очень доходчиво: http://tula.bofh.ru/articles/184


Название: Re: Мутексы: в чем сила, брат?
Отправлено: Gryz от Сентябрь 17, 2007, 11:45
Собственно, интересует целесообразность данной конструкции (в Qt)
А альтернативы?


Название: Re: Мутексы: в чем сила, брат?
Отправлено: Dodge от Сентябрь 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;
 }

Вопросы есть?  ;)

З.Ы.  ??? Смысл опроса вообще не понятен...


Название: Re: Мутексы: в чем сила, брат?
Отправлено: Racheengel от Сентябрь 17, 2007, 12:25
Да надо было как то сделать программу с тредами.
Спросил вот у знакомых программеров недавно - чем они пользуются для подобного?
Оказалось, что половина народу вообще про мутексы даже не слышала... Юзают статические локи.


Название: Re: Мутексы: в чем сила, брат?
Отправлено: Gryz от Сентябрь 17, 2007, 12:32
Да надо было как то сделать программу с тредами.
Спросил вот у знакомых программеров недавно - чем они пользуются для подобного?
Оказалось, что половина народу вообще про мутексы даже не слышала... Юзают статические локи.
Т.е. например статический int? это зло. не гарантируется атомарность операций блокировки и проверки блокировки. С большой вероятностью будет работать, но...


Название: Re: Мутексы: в чем сила, брат?
Отправлено: Tonal от Сентябрь 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) система гарантирует что блок будет выполнятся только в одном треде.


Название: Re: Мутексы: в чем сила, брат?
Отправлено: vaprele07 от Сентябрь 17, 2007, 13:24
близко:
Цитировать
Брюс Эккель признался в бессилии (http://www.linux.org.ru/jump-message.jsp?msgid=2146381)

Я первый признаЮсь, что не смогу написать корректную мультипоточную программу ни на C++, ни на Java, несмотря на годы, которые я провел, обучая тысячи людей этим языкам программирования. Это за пределами моих возможностей.
Что уж говорить об "обычных программистах на C++"?


Название: Re: Мутексы: в чем сила, брат?
Отправлено: fightcat от Сентябрь 17, 2007, 15:23
Присоединяюсь к общему мнению - без них - никуда :)
Мьютексы - аттрибут не библиотеки, а стиля программирования. Если код ориентирован на многопоточность, то мьютексы необходимы, а следовательно какой бы библиотекой Вы не пользовались, придется либо брать реализацию мьютексов этой библиотеки, либо пользоваться нативными, либо, для маньяков, писать свои :)


Название: Re: Мутексы: в чем сила, брат?
Отправлено: Deiv от Сентябрь 17, 2007, 15:44
Да, при мультитредовой программе где треды работают с общими блоками данных без них никуда.
Иначе сегфолта или каши в данных тебе не избежать, к сожалению выяснено на собственном опыте.
Правда писал без qt, просто на плюсах.


Название: Re: Мутексы: в чем сила, брат?
Отправлено: ритт от Сентябрь 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

зы: брюсу эккелю пригодилось бы!