9

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

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

Astd::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在接收线程处理它时指针是有效的,我如何释放结构使用的内存?

4

1 回答 1

14

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

队列中的副本将一直存在,直到您使用 删除它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();

当然,您可以重新设计它以最小化接收端互斥锁的持续时间(例如,如果编织魔法需要很长时间),这只是一个粗略的示例,展示了一种方法。

于 2013-04-17T01:20:01.497 回答