createthread创建多线程,传递参数到线程有有关问题~C++

createthread创建多线程,传递参数到线程有问题~~C++
线程函数:
DWORD WINAPI sendthread(void *param)
{
  char * str = (char *)param;
   
  int iRet = send(consock, str, sizeof(str), 0);///consock为全局变量
  if (iRet <= 0)
  {
  printf("发送失败 "); 
  }
  else
  {
  printf("发送 %d\n", iRet);
  }
  }
  return 0;
}
在主函数中创建线程:
   
  char response[1024];
  while(文件还有数据)
  {
  此处从文件中读取数据为response赋值;且经验证response赋值正确。
  HANDLE hsend = CreateThread(NULL, 0, sendthread, (void*)response, 0, NULL);
  CloseHandle(hsend);
  }
 问题是,如果不用多线程,直接在主函数中send()少量数据可以成功,数据量大时就会死。
 但是,多线程以后,数据发送就混乱了。接收方很大部分数据没有收到。 调试了一下,好像有时 char * str = (char *)param;这句执行后str没有数据。
 大侠们指教一下是咋回事吧,急急急啊!!

------解决方案--------------------
int iRet = send(consock, str, sizeof(str), 0);///
-------
这里错了吧,sizeof(str); 32为平台,是4。
另外你CreateThread将response作为线程函数的参数传递给线程,你需要保证response的作用域范围
------解决方案--------------------
每读取一次数据,就创建一个线程来发送?
没有你这样做的吧?

如果你非要这样,必须保证每个线程的buffer不一样,互不影响,所以你可以每次都把response缓存new出来,步骤是(主线程):
new char[];
read_file;
create_thread;

sendthread线程:
send;
delete str;

但这样还有一个问题,就是你的数据乱序了,接收方可以收到所有数据,但顺序是乱的。

当然,另外还有一个问题,楼上指出来了,你的长度没有传给sendthread线程,所以send的时候,无法知道长度,你每次都只发了4字节而已。

我建议你还是慢慢来,我感觉你现在还没有到多线程网络编程传送文件这个地步,再准备准备。