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

时间:2013-04-17 01:15:24

标签: c++ multithreading memory-management

我正在编写一个包含两个线程的C ++应用程序。线程A将向线程B发送消息。消息类型可以是:

struct MyMessageType
{
  int a;
  enum MyEnum b;
  bool someFlag;
}

在传递消息的线程之间共享std::queue<MyMessageType> messageQueue

在发送帖子中,我会有类似的内容:

struct MyMessageType newMessage;
newMessage.a = 14;
newMessage.b = someEnumeratedValue;
newMessage.someFlag = false;
GrabTheMutexProtectingTheQueue();
messageQueue.push(newMessage);
ReleaseTheMutexProtectingTheQueue();

我的问题是关于内存管理,有两个方面:

A)当接收线程收到消息时,如何确保指向newMessage的指针有效?例如,如果在接收线程处理消息之前创建newMessage的函数结束并且newMessage超出范围,会发生什么?

B)一旦我确保newMessage指针在接收线程处理时有效,我怎样才能释放结构使用的内存?

1 个答案:

答案 0 :(得分:9)

std::queue push()函数会存储副本您提供的内容(请参阅here),因此您不必担心它超出了范围。

队列中的副本将一直存在,直到您使用pop()将其删除。

因此,在发送方面,这是一个简单的问题(例如):

lock_mutex();
myqueue.push (something);
unlock_mutex();
// Do whatever you want with something, the queue has a copy

,并在接收端:

lock_mutex();
while (myqueue.empty()) {
    unlock_mutex();
    // possibly yield to another thread
    lock_mutex();
}
something = myqueue.front();
weaveMagicWith (something);
myqueue.pop();
unlock_mutex();

当然,您可以对其进行重新设计以最大程度地减少接收端互斥锁的持续时间(例如,如果编织魔法需要很长时间),它只是一个显示单向的粗略示例这样做。