c - pthread_create 期间大小为 8 的无效写入

标签 c multithreading tcp valgrind

我有一个简单的 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/

相关文章:

c++ - gcc 不会编译缺少的 sys/cdefs.h

c - 在 C 中,如何检测 free() 函数实现中的边界写入错误?

Linux内核: is vfs_write thread safe?

go - 在 Golang 中,为什么 conn.Write tcp 响应为空?

c++ - 信号量和互斥锁

c - 使用 while 循环通过 scanf 用户输入

php - 多线程 Curl 无法处理大量并发 URL?

c# - 如何监控 Parallel.ForEach 的进度

c - SSL_Read/SSL_Write 中应该调用什么来重新协商

http - 在发送响应之前测量 goodput