QMutex,如果线程正在运行,请在这里等待

时间:2013-12-20 01:15:42

标签: c++ qt mutex qmutex

我只想实现如下代码。

QString Class1::getNonce()
{
    //if some thread is getting nonce wait here until it finishes the its own job.
    mutex.lock();
    QString nonce=QString("%1").arg(QDateTime::currentDateTime().toTime_t());
    mutex.unlock();
    return nonce;    
}

即使我用互斥锁编写不同的线程也得到相同的随机数。我怎么解决这个问题? 感谢。

3 个答案:

答案 0 :(得分:2)

为你的随机数使用原子计数器:

QString Class1::getNonce()
{
    static std::atomic<unsigned long long> counter;
    return QString::number(counter++);
}

答案 1 :(得分:2)

我更喜欢使用QMutexLocker

Class1::Class1()
{
    m_mutex = new QMutex();

}

QString Class1::getNonce()
{
    static int counter = 0;
    QMutexLocker locker(m_mutex);
    counter++;
    return QString::number(counter);
}

希望有所帮助。

答案 2 :(得分:1)

感谢您使用类似

的所有消息
nonce=QDateTime::currentDateTime().toTime_t()+7500;

......

QString Class1::getNonce()
{
    QElapsedTimer timer;
    timer.start();

    mutex.lock();
    nonce+=timer.nsecsElapsed()/250;
    mutex.unlock();
    return QString("%1").arg(nonce);
}