我有一个简单的 TCP 服务器应用程序。它由主函数、TCP 线程函数和线程计时器(TCP 线程在 45 秒后结束)组成。问题在于线程的创建。服务器运行了一段时间然后突然崩溃了。这是我创建线程的方式(在 while 循环中):
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);
这是来自 pastebin 的 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;
最佳答案
仅根据您在问题中向我们展示的代码,可能是 clients
增加到大于 NTHREADS
,导致您的负索引freethreads
数组。
索引越界,在任一方向,都会导致 undefined behavior .
您需要检查 clients
永远不会大于 NTHREADS
,当然还需要在客户端断开连接时减小它(同时注意它永远不会低于零)。
关于c - pthread_create 期间大小为 8 的无效写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23595914/