我正在进行一项练习,最终将变成用于教育目的的pthread实验。在这里,我正在列出一个列表(字母表)并尝试获取五个数字列表,我可以将它们提供给pthread来分析某些内容。例如,numList = 0 5 10 15 20 25
,在字母表的情况下。最后,我将对其进行设置,以便pthread将获取该列表并将列表中这些位置的元素与另一个元素进行比较。我创建了一个divList函数来尝试返回上面的列表,以便我可以使用它。虽然我在函数中得到了正确的结果,但我没有将列表返回到main。我处理指针和函数的方式有明显的错误吗?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#define num_threads 5
/* Global variable: accessible to all threads */
char *list = "abcdefghijklmnopqrstuvwxyz";
/* ----------------------------------------- */
int *divList(int MAX, int pos);
void* Hello(void* rank); /* Thread Function */
int main(int argc, char *argv[])
{
int i, n, thread;
pthread_t* thread_handles;
n = strlen(list);
for (i = 0; i < num_threads; i++){
if (i <= n % num_threads) // str length / 5 ... remainder
// = 0, 1, 2, 3, 4
printf("elements: %d\n", divList(n + 1, i));
else{
printf("elements: %d\n", divList(n, i));
}
}
thread_handles = malloc (num_threads*sizeof(pthread_t));
for (thread = 0; thread < num_threads; thread++){
pthread_create(&thread_handles[thread], NULL, Hello,
(void*) thread);
}
printf("Hello from the main thread\n");
for (thread = 0; thread < num_threads; thread++)
pthread_join(thread_handles[thread], NULL);
free(thread_handles);
return 0;
} /* MAIN */
int *divList(int MAX, int pos)
{
int i = 0, j;
int *numList = malloc(MAX + 1);
for (j = pos; j < MAX; (j = j + num_threads)){
numList[i] = j;
printf("test list: %d\n", numList[i]);
i++;
}
return numList;
}
void* Hello(void* rank) {
int my_rank = (int) rank;
printf("Hello from thread %d of %d\n", my_rank, num_threads);
return NULL;
} /* Hello */
答案 0 :(得分:1)
divList()
返回指向int
数组的第1个元素的指针,其元素数等于传入devList()
的元素作为第一个参数加1,下面是代码存储在plist
。
要访问这些值,您可以将指针视为数组,例如循环以打印其值:
void printList(int * plist, size_t s)
{
for (size_t i = 0; i < s; ++i)
{
printf("element[%zu]: %d\n", i, plist[i];
}
}
int main(int argc, char *argv[])
{
int i, n, thread;
int *plist = NULL;
pthread_t *thread_handles;
n = strlen(list);
for (i = 0; i < num_threads; i++)
{
if (i <= n % num_threads)
{
plist = divList(n + 1, i);
printList(plist, n + 1); /* divList allocates one more then needed
but never initialises it, so do not print it. */
}
else
{
..
答案 1 :(得分:0)
您的divList函数返回int *
,您将返回值视为int
(您使用%d
打印它)。您应该将返回的值保存在变量中,因为您在使用它之后应该释放该内存(每次调用divList都会分配内存,而且目前您没有释放它。)
我不确定你想用divList给出的数字到底是什么,但是这里是你如何访问列表中的元素:
int *arr = divList(n+1, i);
printf("%d\n", arr[5]);