我有简单的TCP服务器应用程序。它由主要功能,TCP线程功能和线程计时器组成(TCP线程在45秒后结束)。问题在于创建线程。服务器运行一段时间然后突然崩溃。这是我创建线程的方式(在循环中):
for (i = 0; i < NTHREADS; i++)
freethreads[i] = i;
clients++;
pthread_mutex_lock(&clientMtx);
tmp.sockfd = new_sockfd;
tmp.threadid = NTHREADS - clients;
pthread_create(&threadid[freethreads[NTHREADS - clients]], &attr, &tcp_main, &tmp);
sleep(0);
pthread_mutex_unlock(&clientMtx);
以下是来自badbin的valgrind和helgrind的日志:
valgrind
helgrind
我不知道,这部分意味着什么:
==3405== Invalid write of size 8
==3405== at 0x4E3A52F: pthread_create@@GLIBC_2.2.5 (pthread_create.c:563)
==3405== by 0x4027DF: main (robot4.c:489)
==3405== Address 0x8872e9c0 is not stack'd, malloc'd or (recently) free'd
非常感谢每一条建议。
编辑:
threadid和freethreads部分:
pthread_t threadid[NTHREADS];
int freethreads[NTHREADS];
for (i = 0; i < NTHREADS; i++)
freethreads[i] = i;
答案 0 :(得分:2)
仅使用您在问题中向我们展示的代码,可能会clients
增加到大于NTHREADS
,导致您拥有freethreads
的否定索引阵列。
在任一方向上索引超出数组的范围都会导致undefined behavior。
您需要检查clients
永远不会超过NTHREADS
,当然也会在客户断开连接时减少它(同时注意它永远不会低于零)。