如何在C ++中正确管理发送到线程的消息

时间:2018-12-13 15:46:31

标签: c++ multithreading

在我的Android应用中,我使用C ++做一些工作。在我的C ++代码中,我使用线程来执行一些任务。使用this examplethis example,这是我的操作方法(我简化了实际代码以使其易于阅读):

std::thread* threadLocal;
std::queue<ThreadMessage*> queueLocale;
std::mutex mutexLocal;
std::condition_variable cvLocal;

struct ThreadMessage
{
    ThreadMessage(int i)
    {
        id = i;
    }
    int id;
};

void MyWorkerThread::createThread()
{
    if (!threadLocal)
    {
        threadLocal = new std::thread(&MyWorkerThread::process, this);
    }
}

void MyWorkerThread::sendTask1()
{
    if (threadLocal)
    {
        // message:
        ThreadMessage* threadMessage = new ThreadMessage(MSG_TASK_1);

        // send the message:
        std::unique_lock<std::mutex> lock(mutexLocal);
        queueLocale.push(std::move(threadMessage));
        cvLocal.notify_one();
    }
}

void MyWorkerThread::sendTask2()
{
    if (threadLocal)
    {
        // message:
        ThreadMessage* threadMessage = new ThreadMessage(MSG_TASK_2);

        // send the message:
        std::unique_lock<std::mutex> lock(mutexLocal);
        queueLocale.push(std::move(threadMessage));
        cvLocal.notify_one();
    }
}

void MyWorkerThread::process()
{
    while (1)
    {
        // init :
        ThreadMessage* threadMessage = 0;

        // waiting for messages :
        {
            std::unique_lock<std::mutex> lock(mutexLocal);
            while (queueLocale.empty())
            {
                cvLocal.wait(lock);
            }
            threadMessage = std::move(queueLocale.front());
            queueLocale.pop();
        }

        // tasks :
        switch (threadMessage->id)
        {
            case MSG_TASK_1:
            {
                doSomeWork1();
                delete threadMessage;
                break;
            }

            case MSG_TASK_2:
            {
                doSomeWork2();
                delete threadMessage;
                break;
            }

            default:
            {
                delete threadMessage;
                break;
            }
        }
    }
}

在大多数情况下,它运行良好,但是有时,我的应用程序在调用delete threadMessage时崩溃,而且我不明白为什么(因为我看不到如何在同一个对象上两次调用它)。

这是我需要向线程发送消息的原因,而不仅仅是每次我想运行doSomeWork1()doSomeWork2()时都创建新线程:

  • doSomeWork1()doSomeWork2()函数必须在同一线程中执行
  • 其中一个函数经常被调用(大约200次/秒),所以我不想每次都创建一个线程

所以我的问题是:将消息发送到线程并在线程内部进行管理以避免在delete上出错的正确方法是什么?

感谢您的帮助。

0 个答案:

没有答案