C++ 同步主线程和工作线程

C++ 同步主线程和工作线程,c++,multithreading,qt,C++,Multithreading,Qt,在QT中,我从主(GUI)线程创建一个工作线程,以执行访问两个线程共享的资源的特定操作。在GUI中的某些操作上,主线程必须操作资源。我尝试使用QMutex锁定该特定资源。此资源被工作线程持续使用,如何就此通知主线程? 尝试使用QWaitCondition,但应用程序崩溃 是否有其他选项可以通知线程并实现线程之间的同步? 附加了代码片段 void WorkerThread::IncrementCounter() { qDebug() << "In Worker Thread I

在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();
}
void WorkerThread::IncrementCounter()
{

qDebug()您使用的等待条件完全错误。 我敦促你们仔细阅读互斥体和条件,也许可以看看

wait()将阻止执行,直到在某个地方调用notify_one()或notify_all()。这当然不会在代码中发生。
如果一行中只包含唤醒调用,则不能在一行中等待一个条件,然后期望调用下两行


您要做的是在一个线程中等待(),在另一个线程中通知_XXX()。

您使用的等待条件完全错误。 我敦促你们仔细阅读互斥体和条件,也许可以看看

wait()将阻止执行,直到在某个地方调用notify_one()或notify_all()。这当然不会在代码中发生。
如果一行中只包含唤醒调用,则不能在一行中等待一个条件,然后期望调用下两行


您需要的是在一个线程中等待()并在另一个线程中通知XXX()。

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

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->attach()获得多个线程可以读取的锁;但这更多用于读取不同进程的共享内存


您可以使用这个而不是静音。我认为如果您尝试锁定它,而其他进程已经锁定了它,它将一直阻塞,直到其他进程解锁它。

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

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->attach()获得多个线程可以读取的锁;但这更多用于读取不同进程的共享内存


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

两个线程共享的资源-你真的需要这个吗,或者工作线程能发出信号让主线程代表它访问资源吗?看起来像waitCondition.wait需要其他地方的通知才能真正发布它。不熟悉QWaitCondition,但如果它基于条件变量,通常等待将挂起,直到有人通知。我在setCounter中没有看到通知与等待相对应。两个线程共享的资源-您真的需要这个吗,or工作线程可以发出信号让主线程代表它访问资源吗?看起来像waitCondition。wait需要从其他地方发出通知才能真正释放它。不熟悉QWaitCondition,但如果它基于条件变量,通常等待将挂起,直到有人通知。我看不到Notify与设置计数器中的等待相对应。