Проблема: Qt. Потокобезопасность. Обращение к переменной.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Melfis, 3 May 2012.

  1. Melfis

    Melfis Elder - Старейшина

    Joined:
    25 Apr 2011
    Messages:
    505
    Likes Received:
    105
    Reputations:
    53
    Пишу на qt под иксы. Проблема с тредами.
    Создание тредов:
    Code:
    void MainWindow::start() {
    	int threadsCount = Settings::get("threads_count").toInt();
    	QThread *threads[threadsCount];
    
    	for (int i = 0; i < threadsCount; i++) {
    		QThread *validator = new Validator(i, statistic);
    		threads[i] = validator;
    		threads[i]->start();
    	}
    
    }
    Обработка.
    Code:
    void Validator::work() {
    	int increase = Settings::get("threads_count").toInt();
    	for (int i = this->threadNumber; i <= Statistic::getTotalMailsCount(); i += increase) {
    		mutex.lock();
    		statistic->increaseCheckedMailsCount();
    		qDebug() << this->threadNumber << i;
    		mutex.unlock();
    		//sleep(1);
    	}
    }
    Есть общее кол-во итераций, есть кол-во тредов, в которых эти итерации надо обработать.
    statistic->increaseCheckedMailsCount(); - Делает инкремент операции. Как раз проблема в этом методе. на 17к итераций он может не сработать раз 30, с мьютексом меньше (хотя по идее должны и без него так же быть...). Смотрел вывод консоли - треды срабатывают нормально. Проблему я представляю как невозможность одновременного доступа к переменной через метод, но как её решить?

    В реале прога будет работать медленнее, но всё же не хотелось чтобы какая-то часть её работала неправильно хоть даже в теории.

    Зы. чем больше тредов, тем собсна больше пропусков.
     
  2. \\ChaOs//

    \\ChaOs// Member

    Joined:
    26 Feb 2009
    Messages:
    102
    Likes Received:
    26
    Reputations:
    5
    Без какой-либо блокировки все вышеописанное будет иметь место.
    Судя по коду, проблем никаких быть не должно, но это только в предоставленном тобой участке.

    P.S. Логичней было бы использовать мьютексы в теле функции increaseCheckedMailsCount(), а не перед её вызовом.
     
    1 person likes this.