gpt4 book ai didi

c - 如何用 C 创建 Protocol Buffer 消息数组

转载 作者:行者123 更新时间:2023-11-30 17:47:28 24 4
gpt4 key购买 nike

在阅读之前:您将看到我用来初始化缓冲区的 calloc 是导致问题的原因,但我仍然不知道为什么。静态定义缓冲区数组可以解决问题,如果您继续阅读,您将会看到...

我正在编写一个由 2 个线程组成的 UDP 服务器:一个接收线程和一个解析线程。接收线程使用recvfrom监听套接字并将其接收到的消息推送到received_msgs_buf数组。解析线程从 receive_msgs_buf 数组中弹出并决定如何处理它。

receed_msgs_buf 数组受互斥体保护,信号量向解析消息线程发出信号,尝试从数组中弹出消息。问题是,每次我尝试将收到的消息推送到 receive_msgs_buf 时,都会出现段错误。

以下是我为缓冲区分配内存的方式:

// this is in the header file
extern UXIMessage::Wrapper* received_msgs_buf;

// this is in the main.cpp file that calls pthread_create()
UXIMessage::Wrapper* received_msgs_buf;

// This is in the init function for the receive thread, defined in the udp.cpp file
received_msgs_buf = (UXIMessage::Wrapper*)calloc(MAX_NUM_MSGS_IN_QUEUE, sizeof(UXIMessage::Wrapper));

这是在接收线程中调用的推送函数:

void push_to_receive_buf(UXIMessage::Wrapper uxi_msg) {
pthread_mutex_lock(&received_msgs_mutex);
if( num_received_msgs < MAX_NUM_MSGS_IN_QUEUE ) {
printf("Message to put in buffer = %s\n", uxi_msg.DebugString().c_str());
printf("Num received messages = %d\n", num_received_msgs);
printf("Buf = %d\n", received_msgs_buf);
// THE FOLLOWING LINE SEGFAULTS
received_msgs_buf[num_received_msgs++] = uxi_msg;
}
pthread_mutex_unlock(&received_msgs_mutex);
sem_post(&received_msgs_sem);
}

从打印语句中我可以看到接收到的消息数已正确初始化为 0,接收到的消息完全有效并且缓冲区指针不为 NULL。这是打印输出:

要放入缓冲区的消息 = message_id: OCU_HEARTBEATocu_heartbeat { ocu_id:4747}

收到的消息数 = 0

缓冲 = 778112

段错误发生在 CopyFrom() 函数中,该函数由 = 运算符调用。

编辑:已经晚了,但明天我会尝试使用 C++ std::vector...

Edit2:为了澄清起见,互斥体和信号量都在主函数中正确初始化,如下所示:

pthread_mutex_init(&received_msgs_mutex);
pthread_mutex_init(&msgs_to_send_mutex);
sem_init(&received_msgs_sem, 0, 0);
sem_init(&msgs_to_send, 0, 0);

EDIT3:问题是 CALLOC。当我静态定义 receive_msgs_buf 时,如下所示:

 // this is in the header file
extern UXIMessage::Wrapper received_msgs_buf[MAX_NUM_MSGS_IN_BUF];

// this is in the main.cpp file that calls pthread_create()
UXIMessage::Wrapper received_msgs_buf[MAX_NUM_MSGS_IN_BUF];

代码有效...有人知道我的 calloc 做错了什么吗?

最佳答案

首先,我没有看到互斥变量 receive_msgs_mutex 的初始化- 也不是静态的,也不是通过 pthread_mutex_init() 实现的。所以,也许初始值是错误的。

第二,你用信号量做一些事情......另外,没有有关初始化或锁定它的信息。

因此,没有提供足够的信息来重现您的错误或分析代码。请编写单独的测试,并在此处分享。或者,您可以下载我的线程间队列,并免费使用它:

http://olegh.cc.st/Queue.cpp.txt

它有效。

关于c - 如何用 C 创建 Protocol Buffer 消息数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18927704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com