线程不刷新数据,错误显示屏幕中的数据

时间:2012-04-27 13:57:25

标签: c++ multithreading file sockets

我正在创建一个套接字程序,用于将数据从一台PC传输到另一台,但是当我发送一些二进制数据进行处理时,我遇到了问题。 在这种情况下,我需要一个线程来监听数据套接字发送数据时的消息套接字。 所以我发现问题不是套接字,如果我试图将数据写入屏幕(这次没有套接字),就会出现问题。 所以我尝试使用fflush(stdout)刷新数据而没有运气。 代码以这种方式工作。

Initialize the 2 sockets.
Initialize 2 threads.
  One to get the data back through the data socket.
  The other send the data.    
And while sending all the data one while(true){sleep(1)} in the main function, because the data can take 1 second to be processed or one hour so i keep the program alive this way (Don't know if that is the better way).

我创建了一个较小的版本,只使用一个线程来读取并发送到屏幕,而主要是在一段时间内。

代码:

#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

const int RCVBUFSIZE=2000;
char echoString[RCVBUFSIZE];

static void * _sendExec(void *instance);

int main(){
  pthread_t m_thread;
  int merror;
  merror=pthread_create(&m_thread, NULL, _sendExec, NULL);
  while(1){sleep(1);}
}
static void * _sendExec(void *instance){
  int size;
  for(;;){
    while((size=read(fileno(stdin), echoString, RCVBUFSIZE))>0) write(fileno(stdout), echoString, size);
    fflush(stdin);
    fflush(stdout);
    pthread_exit(0);
  }
}

如果你尝试cat file.tar.gz | ./a.out | tar -zvt你可以看到并不是所有的数据都显示在屏幕上,如果我放在主屏幕上,取消睡眠就可以了,问题是我需要数据回来,这需要时间。 这就像我做一个cat file.tar.gz | ssh root @ server“tar -zvt”。

谢谢大家

1 个答案:

答案 0 :(得分:1)

我认为您提供的代码不是您正在使用的实际代码。 正如wreckgar23所提到的,如果你想等待线程完成,你应该在main函数的末尾使用pthread_join。您可以删除while(1){sleep(1);} / pthread_exit(0),pthread_join将使主线等待线程完成。

同样使用while(1)/ for(;;)并不是一个好主意..你至少可以使用一个int值将其设置为0并进行所有数据处理,直到它将其值改为1.你可以检查通过套接字收到的数据中的某个“消息”是否有终止命令,并将int的值设置为1.(这样就可以通过(客户端)输入,整个服务器控制服务器的生命周期)完成数据处理后,应用程序可以停止。)如果这样做,你还应该考虑安全问题。

您还应该明确指定您使用的是哪种套接字.. 例如,如果使用udp套接字并且缓冲区很小,则可能会丢失数据。 此外,您无法从缓冲区打印数据并同时写入缓冲区。 (将缓冲区写入屏幕需要时间..在将数据写入屏幕时,可能会有新数据到达缓冲区并在有机会打印之前覆盖旧数据)