我的C知识很年轻,请原谅我:)真的有两个问题,
如何将以下代码转换为正确使用pthread_t *threadsArray
而非threadsArray[MAXCON]
的内容?
有充分的理由吗?我听说我应该避免使用显式数组,并尽可能使用指针定义的数组。
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);
}
答案 0 :(得分: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;
答案 1 :(得分:0)
首先回答你的第二个问题:听起来你在谈论堆栈和堆分配之间的差异。
像你所做的那样在函数体中声明数组会占用堆栈空间,这可能非常有限(几千字节到几兆字节)。
另一种方法是在“堆”上分配数组,该堆仅受计算机中可用内存的限制。要在堆上分配内存,请使用malloc()
。
所以将第一行改为:
pthread_t *threadsArray = malloc(MAXCON * sizeof(pthread_t));
(如果系统的malloc可能失败,可能会检查NULL)
只需要在堆上分配数组即可。
之后您还需要free(threadsArray)
释放内存。
但是如果MAXCON很小,那么就像你所做的那样在堆栈上分配数组应该没问题。