线程接收字符串为空

时间:2013-06-18 14:34:55

标签: c++ string pthreads

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中打印字符串,结果实际上是发送的字符串。但是,一旦将字符串传递给interpretWrapper,我在打印res [0]时得到的只是一个空字符,而预期的输出将是发送字符串的第一个字符。我也尝试过使用字符串,并且还有一个空字符串。

此外,我尝试发送一个整数,而在interpretWrapper中打印整数则正确生成了传递的整数。我一直试图弄清楚两天,这似乎是什么问题?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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