通过MBED OS上的队列和线程复制char*值

通过MBED OS上的队列和线程复制char*值,c,multithreading,arm,rtos,mbed,C,Multithreading,Arm,Rtos,Mbed,我试图在K64F板上的Arm MBED操作系统上实现一些RTOS线程。我正在脱离RTOS示例,我已经成功地使用队列运行和通信了不同的线程。我在将char*值从一个结构复制到另一个结构以从一个队列获取消息时遇到问题。我相信我误解了一些事情,我的问题与指针和内存处理有关,但我无法解决它 我已经定义了不同的队列来向不同的线程发送数据。我还创建了一个基本的数据结构,其中包含了我在这些线程之间所需的所有内容。在这个结构中,我有一个char*变量rHostAddr,其中包含请求服务的远程主机地址 Memor

我试图在K64F板上的Arm MBED操作系统上实现一些RTOS线程。我正在脱离RTOS示例,我已经成功地使用队列运行和通信了不同的线程。我在将char*值从一个结构复制到另一个结构以从一个队列获取消息时遇到问题。我相信我误解了一些事情,我的问题与指针和内存处理有关,但我无法解决它

我已经定义了不同的队列来向不同的线程发送数据。我还创建了一个基本的数据结构,其中包含了我在这些线程之间所需的所有内容。在这个结构中,我有一个char*变量rHostAddr,其中包含请求服务的远程主机地址

MemoryPool<cMsg, 16> AMPool;
Queue<cMsg, 16> AMQueue;
MemoryPool<cMsg, 16> ioLedPool;
Queue<cMsg, 16> ioLedQueue;

typedef struct{
    ...

    char* rHostAddr;
    ...
} cMsg;
在线程1上,我等待消息到达,在某些条件下,我将整个结构复制到从相应池创建的新结构上,并将其插入到新队列ioLedQueue中

--- Thread 1 ---

cMsg *msg;
cMsg *ledm = ioLedPool.alloc();
osEvent evt = AMQueue.get();
msg = (cMsg*)evt.value.p;

msg.rHostAddr = ledm.rHostAddr;
printf("\t -- Host 1 -- %s\n\r", ledm->rHostAddr);
ioLedQueue.put(ledm);
在线程2上,我得到消息结构和数据

--- Thread 2 ---

cMsg *msg;
osEvent evt = ioLedQueue.get();
msg = (cMsg*)evt.value.p;
printf("\t -- Host 2  -- %s\n\r", msg->rHostAddr);
在此阶段,rHostAddr为空。我可以在printf主机1上看到该值,但在主机2中看不到

如果我没有错的话,我相信问题来自于使用=操作数赋值,因为我复制的是地址,而不是值,当第一个池内存被释放时,它将丢失。我尝试过用memcpy、strcpy甚至我自己的char-by-char复制值,但调用此方法时系统挂起


如何通过此队列复制值?

查看ARM mbed中的此解决方案:


我把它移到这里,因为正确的答案是作为评论写的。将值转换为字符数组是一种方法,因此字符串数据是结构的一部分

char rHostAddr[40];
现在可以使用srtcpy方法完成分配,并正确地通过所有过程:

char* rcvaddrs = (char*)addr.get_ip_address();

strcpy(message->rHostAddr,rcvaddrs);
请注意,对于char*,值是指针,因此将复制指针。现在两个结构指向同一个字符串。也许你也应该复制字符串。您可以通过将char*x定义为例如char x[123]来实现这一点。现在字符串数据是结构的一部分。此外,如果线程在不同的计算机上运行或拥有自己的内存,那么从一个线程传递到另一个线程的指针将无效。
char* rcvaddrs = (char*)addr.get_ip_address();

strcpy(message->rHostAddr,rcvaddrs);