【发布时间】:2014-08-01 19:16:00
【问题描述】:
我编写了一个客户端/服务器应用程序,其中服务器根据来自客户端的请求生成多个线程。
这些线程应该向客户端(字符串)发送一些数据。
问题是,数据在客户端被覆盖。我该如何解决这个问题?
我已经阅读了一些关于类似问题的其他主题,但无法找到确切的解决方案。
这是我接收数据的客户端代码。
while(1)
{
char buff[MAX_BUFF];
int bytes_read = read(sd,buff,MAX_BUFF);
if(bytes_read == 0)
{
break;
}
else if(bytes_read > 0)
{
if(buff[bytes_read-1]=='$')
{
buff[bytes_read-1]='\0';
cout<<buff;
}
else
{
cout<<buff;
}
}
}
服务器线程代码:
void send_data(int sd,char *data)
{
write(sd,data,strlen(data));
cout<<data;
}
void *calcWordCount(void *arg)
{
tdata *tmp = (tdata *)arg;
string line = tmp->line;
string s = tmp->arg;
int sd = tmp->sd_c;
int line_no = tmp->line_no;
int startpos = 0;
int finds = 0;
while ((startpos = line.find(s, startpos)) != std::string::npos)
{
++finds;
startpos+=1;
pthread_mutex_lock(&myMux);
tcount++;
pthread_mutex_unlock(&myMux);
}
pthread_mutex_lock(&mapMux);
int t=wcount[s];
wcount[s]=t+finds;
pthread_mutex_unlock(&mapMux);
char buff[MAX_BUFF];
sprintf(buff,"%s",s.c_str());
sprintf(buff+strlen(buff),"%s"," occured ");
sprintf(buff+strlen(buff),"%d",finds);
sprintf(buff+strlen(buff),"%s"," times on line ");
sprintf(buff+strlen(buff),"%d",line_no);
sprintf(buff+strlen(buff),"\n",strlen("\n"));
send_data(sd,buff);
delete (tdata*)arg;
}
【问题讨论】:
-
贴出服务器线程代码...
-
“问题是,数据在客户端被覆盖。” - 这不太可能。 “覆盖*”更有可能发生在服务器端。
-
@StephenC 实际上,来自不同线程的数据似乎是由 TCP 一起发送的。
-
为什么写入缓冲区的代码以及随后对
send_data()的调用不受互斥锁的保护?那是你依赖的原子数据,不是吗? -
是的,但我尝试通过保护该呼叫..仍然没有好处..
标签: c++ c multithreading sockets pthreads