同步主线程和工作线程

时间:2018-02-13 06:20:55

标签: c++ multithreading qt

在QT中,从主(GUI)线程我创建一个工作线程来执行某个操作,该操作访问两个线程共享的资源。在GUI中的某些操作中,主线程必须操纵资源。我尝试使用QMutex来锁定该特定资源。这个资源是由工作线程连续使用的,如何通知主线程呢? 尝试使用QWaitCondition但它崩溃了应用程序。

是否还有其他选项可以通知并实现线程之间的同步? 附上了代码段。

void WorkerThread::IncrementCounter()
{
    qDebug() << "In Worker Thread IncrementCounter function" << endl;
    while(stop == false)
    {
        mutex.lock();
        for(int i = 0; i < 100; i++)
        {
            for(int j = 0; j < 100; j++)
            {
                counter++;
            }
        }

        qDebug() << counter;
        mutex.unlock();
    }
    qDebug() << "In Worker Thread Aborting " << endl;
}

//Manipulating the counter value by main thread.
void WorkerThread::setCounter(int value)
{
    waitCondition.wait(&mutex);
    counter = value;
    waitCondition.notify_one();
}

2 个答案:

答案 0 :(得分:2)

您正在使用等待条件完全错误。 我恳请您阅读互斥和条件,并查看some examples

wait()将阻止执行,直到在某处调用notify_one()或notify_all()。当然,您的代码中不会发生这种情况 您不能在一行上等待()条件,然后如果它们包含唯一的唤醒呼叫,则期望调用接下来的两行。

你想要的是一个线程中的wait()和另一个线程中的notify_XXX()。

答案 1 :(得分:0)

您可以在同一进程中使用共享内存。每个线程都可以在写入之前将其锁定,如下所示:

QSharedMemory *shared=new QSharedMemory("Test Shared Memory");

if(shared->create(1,QSharedMemory::ReadWrite))
{
    shared->lock();

    // Copy some data to it
    char *to = (char*)shared->data();
    const char *from = &dataBuffer;
    memcpy(to, from, dataSize);

    shared->unlock();
}

您还应将其锁定以供阅读。如果需要字符串,读取字符串可以更容易写入它们,如果它们是零终止的话。您将要转换.toLatin1()以获取以零结尾的字符串,您可以获取字符串的大小。您可能会获得多个线程可以读取的锁,使用shared-&gt; attach();但这更多的是阅读不同过程的共享内存..

您可以使用此代替静音。我想如果你试图锁定它,而其他东西已经被锁定了,它就会阻塞,直到另一个进程解锁它。