在我的Android应用中,我使用C ++做一些工作。在我的C ++代码中,我使用线程来执行一些任务。使用this example和this 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()
函数必须在同一线程中执行所以我的问题是:将消息发送到线程并在线程内部进行管理以避免在delete
上出错的正确方法是什么?
感谢您的帮助。