2013-06-18 6 views
0
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, и результат является фактически отправленной строкой. Однако, как только строка передается интерпретаторуWrapper, все, что я получаю, когда я печатаю res [0], является пустым символом, тогда как ожидаемый вывод будет первым символом отправленной строки. Я также попытался использовать строки, а также получил пустую строку.Thread получает строку как пустую

Кроме того, я попытался отправить целое число, в то время как печать целого внутри интерпретатора интерпретировала корректно переданное целое число. Я пытался понять это в течение двух дней, что, кажется, проблема?

+0

Где и как определяется «буфер»? –

+0

@JamesKanze Я отредактировал мой вопрос в соответствии с вашими комментариями. Это массив символов. – BitRiver

ответ

2

Родительская нить и ребенок участвуют в гонке: родитель продолжает цикл while и ударяет memset(buffer, 0, buffer_len) перед тем, как дочерний поток смотрит на буфер. Вероятно, вы захотите передать копию дочернему потоку.

+0

И как я могу передать копию вместо ссылки на массив? – BitRiver

+0

malloc новый буфер, скопируйте полученное содержимое и передайте этот новый буферный указатель на ваш поток, пусть поток прочитает его, а затем этот поток освободит буфер одним способом. Лучше всего было бы использовать поточную безопасную очередь. http://stackoverflow.com/questions/4577961/pthread-synchronized-blocking-queue и http://stackoverflow.com/questions/2893713/pthread-queue-system может быть полезно :) – Jimbo

+0

@BitRiver Я бы, вероятно, выделил свежий буфер для каждого 'recv' и передать право собственности новому потоку - по крайней мере до тех пор, пока профилирование не отобразит выделение как узкое место. – Casey

0

Отправить копию буфера, потому что это указатель будет изменен при циклировании!