Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточность, Синхронизация 
V
    Опции темы
Artemon
Дата 16.12.2010, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 2
Всего: 20



Есть несколько потоков, задача:

1. Когда какой-то поток выполняет метод Write, все остальные потоки стоят и ждут.
2. Если хотябы один поток выполняет метод Read, то метод Write не может быть выполнен, но при этом Read может выполняться несколькими потоками одновременно.

У меня сейчас получается, либо выполняем ТОЛЬКО Write, либо ТОЛЬКО Read.

Код

QMutex mutexWrite;

class MyThread : public QThread
{
 public:
     MyThread(int val){this->val = val;}
     void run();

 protected:
     void Read();
     void Write();

     int val;
};

 void MyThread::run()
 {
    while(1)
    {
        if(val)
            Read();
        else
            Write();
    }
 }

 void MyThread::Read()
 {
     mutexWrite.lock();
         
     printf("\nRead");
     this->sleep(1);
    
     mutexWrite.unlock(); 
 }

 void MyThread::Write()
 {
     mutexWrite.lock();
     
     printf("\nWrite");
     this->sleep(5);

     mutexWrite.unlock();
 }

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    MyThread* t0 = new MyThread(0);
    MyThread* t1 = new MyThread(1);
    MyThread* t2 = new MyThread(1);    
    MyThread* t3 = new MyThread(1);    
    
    t0->start();
    t1->start();
    t2->start();    
    t3->start();    

    return a.exec();
}


Это сообщение отредактировал(а) Artemon - 16.12.2010, 19:11


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
borisbn
Дата 17.12.2010, 07:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



QReadWriteLock


Это сообщение отредактировал(а) borisbn - 17.12.2010, 07:46


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
borisbn
Дата 17.12.2010, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Коллега на работе написал сам (просто интересно было, что в этом QreadWriteLock делается). Вот, что получилось. Не тестили. Если не сложно (и не напряжно по времени) - протесть, плиз
Код

class ReadWriteLocker
{
public:
    void lockForRead() {
        m_readMutex.lock();
        m_readMutex.unlock();

        QMutexLocker l( &m_countMutex );
        if ( 0 == m_readersCount ) {
            m_writeMutex.lock();
        }
        ++m_readersCount;
    }

    void unlockForRead() {
        QMutexLocker l( &m_countMutex );
        --m_readersCount;
        if ( 0 == m_readersCount ) {
            m_writeMutex.unlock();
        }
    }

    void lockForWrite() {
        m_readMutex.lock();
        m_writeMutex.lock();

    }

    void unlockForWrite() {
        m_writeMutex.unlock();
        m_readMutex.unlock();
    }

private:
    QMutex m_readMutex;
    QMutex m_writeMutex;
    QMutex m_countMutex;
    int m_readersCount;
};


Это сообщение отредактировал(а) borisbn - 17.12.2010, 17:06


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 17.12.2010, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



также можно реализовать на boost::shared_mutex
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0681 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.