簡體   English   中英

同步主線程和工作線程

[英]Synchronising main thread and worker thread

在QT中,我從main(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();
}

您使用的等待條件完全錯誤。 我敦促您閱讀互斥量和條件,也許看看一些示例

wait()將阻止執行,直到在某處調用notify_one()或notify_all()為止。 當然,這不可能發生在您的代碼中。
您不能在一行上使用wait()條件,然后如果它們包含唯一的喚醒調用,則不能期望接下來的兩行被調用。

您想要的是在一個線程中使用wait(),在另一個線程中使用notify_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()獲得一個可以讀取多個線程的鎖。 但這更多是為了讀取不同進程的共享內存。

您可能只使用它而不是靜音。 我認為,如果您嘗試鎖定它,而其他東西已經將其鎖定,它將阻塞直到其他進程將其解鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM