c++ - 同步主线程和工作线程

标签 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();
}

最佳答案

您使用的等待条件完全错误。 我强烈建议您阅读有关互斥锁和条件的内容,也许可以看看 some examples .

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

你想要的是在一个线程中使用 wait(),在另一个线程中使用 notify_XXX()。

关于c++ - 同步主线程和工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48760618/

相关文章:

c++ - Jgrasp C++ 编译问题

python - 如何允许长时间运行的 python 函数在其父函数终止后继续执行?

windows - Qt + MinGW + another undefined reference to `WinMain@16' 问题

c++ - 我有一个指向参数化函数的指针的成员,我可以扩展参数类型吗?

c++ - 在 cpp、OpenCV 中使用 "Select file"对话框创建 GUI

c++ - QProcess *p 行不是多余的吗?

c# - WPF C# - 从另一个线程更新进度条

java - 如果 poll 不一定返回第一项,ConcurrentLinkedQueue 是一个好的选择吗?

c++ - Qt 中屏幕绘制和键盘按键事件的精确延迟

Qt - 如何将数据与 QTableWidgetItem 相关联?