0

我的C知识还很年轻,所以请原谅我:)真的有两个问题,

  1. 如何将以下代码转换为正确使用的东西,pthread_t *threadsArray而不是threadsArray[MAXCON]

  2. 有充分的理由吗?我听说我应该避免使用显式数组,并尽可能使用指针定义的数组。

pthread_t threadsArray[MAXCON];

int k;
for (k = 0; k < MAXCON; k++) {
    fprintf(stderr, "Make %d\n", k);

    int *connfd = malloc(sizeof(int));
    *connfd = accept(fd, (struct sockaddr *) &cliaddr, &cliaddrlen);
    if (*connfd == -1) {
        perror("Unable to accept connection");
        return 1;
    }

    fprintf(stderr, "Waited\n");

    pthread_t thread;
    pthread_create(&thread, NULL, readWriteToClient, connfd);
    threadsArray[k] = thread;
}

for(k = 0; k < MAXCON; k++){
    fprintf(stderr,"Join %d\n",k);
    pthread_t thread = threadsArray[k];
    pthread_join(thread, NULL);
}
4

2 回答 2

0

我想你想为你的数组使用动态分配的内存(即堆中的内存)而不是堆栈中的内存。当您希望数组生存期大于包含函数或不知道它在编译时的大小时,这通常很有用。

为此,您只需将第一行替换为:

pthread_t *threadsArray;
threadsArray = (pthread_t*)malloc(MAXCON * sizeof(pthread_t));
// malloc may fails and return NULL, you must check this error condition
// and handle it properly (aborting the program, using a smaller array, ...)

使用完数组后,您必须使用以下命令释放内存:

free(threadArray);
threadArray = NULL;
于 2013-01-24T12:07:00.863 回答
0

首先回答您的第二个问题:听起来您在谈论堆栈和堆分配之间的区别。

像您所做的那样在函数体中声明数组将占用堆栈上的空间,这可能非常有限(几千字节到几兆字节)。

另一种方法是在“堆”上分配数组,它仅受计算机中可用内存的限制。要在堆上分配内存,请使用malloc().

因此将第一行更改为:

pthread_t *threadsArray = malloc(MAXCON * sizeof(pthread_t));

(如果您的系统的 malloc 可能失败,可能会检查 NULL)

就是在堆上分配数组所需要做的一切。

您还需要free(threadsArray)事后释放内存。

但是,如果 MAXCON 很小,那么按照您所做的那样在堆栈上分配数组应该没问题。

于 2013-01-24T12:07:45.283 回答