在线程和内存管理之间传递消息

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)

当然,您可以对其进行重新设计,以最大程度地减少接收端互斥锁的持续时间(例如,如果编织魔法花费很长时间),这只是一个粗略的示例,显示了一种方法.