Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Многопоточность


Автор: Artemon 16.12.2010, 19:07
Есть несколько потоков, задача:

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();
}

Автор: borisbn 17.12.2010, 07:42
http://doc.qt.nokia.com/4.7/qreadwritelock.html

Автор: borisbn 17.12.2010, 17:05
Коллега на работе написал сам (просто интересно было, что в этом 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;
};

Автор: azesmcar 17.12.2010, 17:29
также можно реализовать на boost::shared_mutex

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)