Pro*_*mer 5 c multithreading valgrind
我有一个用 C 编写的服务器,每当有新客户端连接时,它就会产生一个新线程。为了测试我的服务器,我编写了一个模拟 500 个客户端的脚本。服务器处理前几百个客户端,最后我从 Valgrind 收到以下错误:
Thread 456: status = VgTs_WaitSys
==4182== at 0x4E383EC: recv (recv.c:34)
==4182== by 0x4017F1: process_data (socket2.h:45)
==4182== by 0x40195E: thread (FBServer.c:82)
==4182== by 0x4E30A03: start_thread (pthread_create.c:300)
==4182== by 0x532DD4C: clone (clone.S:112)
Thread 457: status = VgTs_WaitSys
==4182== at 0x4E383EC: recv (recv.c:34)
==4182== by 0x4017F1: process_data (socket2.h:45)
==4182== by 0x40195E: thread (FBServer.c:82)
==4182== by 0x4E30A03: start_thread (pthread_create.c:300)
==4182== by 0x532DD4C: clone (clone.S:112)
...
Thread 499: status = VgTs_WaitSys
==4182== at 0x4E383EC: recv (recv.c:34)
==4182== by 0x4017F1: process_data (socket2.h:45)
==4182== by 0x40195E: thread (FBServer.c:82)
==4182== by 0x4E30A03: start_thread (pthread_create.c:300)
==4182== by 0x532DD4C: clone (clone.S:112)
Run Code Online (Sandbox Code Playgroud)
在 FBServer.c 的第 82 行,线程调用一个名为 process_data 的函数,该函数从客户端接收数据。函数 process_data 如下所示:
void process_data(int clientSock)
{
size_t n;
char jstring[MAX_LEN + 1];
int bytes_received_so_far = 0;
int bytes_count;
char *buf = NULL;
while(bytes_count = recv(clientSock, jstring, MAX_LEN, 0))
{
if(bytes_count <= 0)
{
close(clientSock);
pthread_exit(NULL);
}
printf("Bytes received = %d\n", bytes_count);
jstring[bytes_count] = '\0';
...
...
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我解释错误消息。
您使用什么版本的 Valgrind?
关于我在来源中找到的唯一评论是:
VgTs_WaitSys, /* waiting for a syscall to complete */
所以它似乎表明该程序只是阻塞在系统调用上(在您的情况下是recv)。我不确定,但这可能根本不是一个错误,只是 Valgrind 踢出的一些额外信息。
| 归档时间: |
|
| 查看次数: |
1407 次 |
| 最近记录: |