1

我只想实现如下代码。

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

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

4

3 回答 3

2

为您的 nonce 使用原子计数器:

QString Class1::getNonce()
{
    static std::atomic<unsigned long long> counter;
    return QString::number(counter++);
}
于 2013-12-20T04:48:44.460 回答
2

我更喜欢使用QMutexLocker.

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

}

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

希望有帮助。

于 2013-12-20T04:57:03.107 回答
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);
}
于 2013-12-21T21:00:38.410 回答