int MapServer::run(void) { Request::setCoutMutex(&_coutMutex); TextDisplayer::setCoutMutex(&_coutMutex); SvgCreator::setCoutMutex(&_coutMutex); _timeoutReference = time(0); std::thread deleteThread(&MapServer::cleanThreads, this); std::thread timeoutThread(&MapServer::checkTimeout, this, _softExit); if (_softExit) timeoutThread.join(); inputLoop(); if (!_softExit) exit(0); _threadSetMutex.lock(); _stopRequested = true; _threadSetMutex.unlock(); deleteThread.join(); TextDisplayer::clearClientMap(); return 0; }
void tst_QWaitCondition::wait_RaceCondition() { { QMutex mutex; QWaitCondition startup; QWaitCondition waitCondition; wait_RaceConditionThread timeoutThread(&mutex, &startup, &waitCondition, 1000), waitingThread1(&mutex, &startup, &waitCondition); timeoutThread.start(); waitingThread1.start(); mutex.lock(); // wait for the threads to start up while (!timeoutThread.ready || !waitingThread1.ready) { startup.wait(&mutex); } QTest::qWait(2000); waitCondition.wakeOne(); mutex.unlock(); QVERIFY(timeoutThread.wait(5000)); QVERIFY(!timeoutThread.returnValue); QVERIFY(waitingThread1.wait(5000)); QVERIFY(waitingThread1.returnValue); } { QReadWriteLock readWriteLock; QWaitCondition startup; QWaitCondition waitCondition; wait_RaceConditionThread_2 timeoutThread(&readWriteLock, &startup, &waitCondition, 1000), waitingThread1(&readWriteLock, &startup, &waitCondition); timeoutThread.start(); waitingThread1.start(); readWriteLock.lockForRead(); // wait for the threads to start up while (!timeoutThread.ready || !waitingThread1.ready) { startup.wait(&readWriteLock); } QTest::qWait(2000); waitCondition.wakeOne(); readWriteLock.unlock(); QVERIFY(timeoutThread.wait(5000)); QVERIFY(!timeoutThread.returnValue); QVERIFY(waitingThread1.wait(5000)); QVERIFY(waitingThread1.returnValue); } }