The*_*eek 5 c++ multithreading memory-management
我正在编写一个带有两个线程的C++应用程序.线程A将向线程B发送消息.消息类型可以是:
struct MyMessageType
{
int a;
enum MyEnum b;
bool someFlag;
}
Run Code Online (Sandbox Code Playgroud)
A std::queue<MyMessageType> messageQueue
用于传递消息的线程之间共享.
在发送线程中,我会有类似的东西:
struct MyMessageType newMessage;
newMessage.a = 14;
newMessage.b = someEnumeratedValue;
newMessage.someFlag = false;
GrabTheMutexProtectingTheQueue();
messageQueue.push(newMessage);
ReleaseTheMutexProtectingTheQueue();
Run Code Online (Sandbox Code Playgroud)
我的问题是关于内存管理,有两个方面:
A)newMessage
当接收线程收到消息时,如何确保指针有效?例如,如果创建的函数newMessage
结束并newMessage
因此在接收线程处理消息之前超出范围会发生什么?
B)一旦我可以确保newMessage
指针在接收线程处理时有效,那么如何释放结构使用的内存?
pax*_*blo 10
该std::queue
push()
函数存储了您提供的任何内容的副本(请参阅此处),因此您不必担心它超出范围.
队列中的副本将一直存在,直到您将其删除pop()
.
所以,在发送方面,这是一个简单的问题(例如):
lock_mutex();
myqueue.push (something);
unlock_mutex();
// Do whatever you want with something, the queue has a copy
Run Code Online (Sandbox Code Playgroud)
并在接收端:
lock_mutex();
while (myqueue.empty()) {
unlock_mutex();
// possibly yield to another thread
lock_mutex();
}
something = myqueue.front();
weaveMagicWith (something);
myqueue.pop();
unlock_mutex();
Run Code Online (Sandbox Code Playgroud)
当然,您可以对其进行重新设计,以最大程度地减少接收端互斥锁的持续时间(例如,如果编织魔法花费很长时间),这只是一个粗略的示例,显示了一种方法.