【发布时间】:2014-06-29 00:59:29
【问题描述】:
我有一个简单的 TCP 服务器应用程序。它由 main 函数、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);
这里是来自 valgrind 和 helgrind 在 pastebin 的日志:
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;
【问题讨论】:
-
显示你对
threadid的定义和初始化。 -
即使使用互斥锁和
sleep调用,将参数传递给线程的方式也不能保证是安全的。相反,我建议您在每个线程的堆上动态分配用于tmp的结构。一旦线程从结构中保存了数据,他们就可以释放它。 -
您是否尝试使用 GDB 查看核心转储?它是否为崩溃提供了线索?
-
是的,我的朋友根据@JoachimPileborg 的帖子发现了这个错误。崩溃是由于我在不同的函数(超时函数)中的错误造成的,该函数使用客户端变量进行操作。你不知道,是否可以删除整个问题?我认为,这对人们来说毫无用处,因为代码不同部分的错误......
标签: c multithreading tcp valgrind