【问题标题】:Thread receives string as empty线程接收字符串为空
【发布时间】:2013-06-18 14:34:55
【问题描述】:
void *interpretWrapper(void* arg) {
    char* res = (char*) arg;
    cout << res[0] << endl;
}

void *recvConn(void * data) {
    char buffer[1024];
    int buffer_len = 1024;
    while(true) {
        memset(buffer, 0, buffer_len);

        if((bytecount = recv(*csock, buffer, buffer_len, 0)) == -1)  {
        printf("yalehwyyy\n");
        fprintf(stderr, "Error receiving data %d\n", errno);
        printf("%d", csock);
        break;
        }else if (bytecount == 0) {
            fprintf(stderr, "Socket Closed ! Robotino needs to reconnect !!\n");
            break;
        }

      pthread_t thread_id = 0;
      pthread_create(&thread_id, NULL, interpretWrapper, &buffer);
      pthread_detach(thread_id);
      printf("Received bytes %d\nReceived string \"%s\"\n", bytecount, buffer);
   }
}

在上面的代码中,每当我收到一个放入缓冲区的字符串时,我都会在 recvConn 中打印该字符串,结果实际上就是发送的字符串。但是,一旦将字符串传递给解释包装器,当我打印 res[0] 时得到的只是一个空字符,而预期的输出将是发送字符串的第一个字符。我也尝试使用字符串,也得到了一个空字符串。

此外,我尝试发送一个整数,而在interpretWrapper 中打印整数会正确生成传递的整数。这两天一直在想办法,请问是什么问题?

【问题讨论】:

  • buffer 在哪里以及如何定义?
  • @JamesKanze 我已根据您的评论编辑了我的问题。它是一个字符数组。

标签: c++ string pthreads


【解决方案1】:

父线程和子线程正在竞争:父线程继续while循环并在子线程查看缓冲区之前点击memset(buffer, 0, buffer_len)。您可能希望将副本传递给子线程。

【讨论】:

  • 我怎样才能传递一个副本而不是对数组的引用?
  • malloc 一个新的缓冲区,将接收到的内容复制到并将这个新的缓冲区指针传递给您的线程,让线程读取它然后让该线程释放缓冲区是一种方法。更好的方法是使用线程安全队列。 stackoverflow.com/questions/4577961/…stackoverflow.com/questions/2893713/pthread-queue-system 可能会有所帮助:)
  • @BitRiver 我可能会为每个 recv 分配一个新缓冲区,并将所有权传递给新线程 - 至少在分析显示分配成为瓶颈之前。
  • @Yakk - 确定一个新的 BufferClass 实例,然后 :)
【解决方案2】:

发送缓冲区的副本,因为它的指针会在循环时改变!

【讨论】:

    猜你喜欢
    • 2013-09-02
    • 2013-05-31
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多