pthread_create期间写入大小为8无效

时间:2014-05-11 17:45:42

标签: c multithreading tcp valgrind

我有简单的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;

1 个答案:

答案 0 :(得分:2)

仅使用您在问题中向我们展示的代码,可能会clients增加到大于NTHREADS,导致您拥有freethreads的否定索引阵列。

在任一方向上索引超出数组的范围都会导致undefined behavior

您需要检查clients永远不会超过NTHREADS,当然也会在客户断开连接时减少它(同时注意它永远不会低于零)。