【发布时间】:2015-02-07 03:12:35
【问题描述】:
对于这个程序,我通过命令行传入数字,然后有一个多线程程序接受每个参数,计算其因子,然后打印它们。我知道 c++,但我对 c 很粗糙,似乎无法为这个程序正确地进行强制转换。特别是当我将参数传递给 thread_create 并将其转换为整数时。我下面的代码可以编译,但转换后的值始终为 0。如何将 char 值转换为 void* 然后转换为整数?
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#define MAX_ARRAY (17)
void *thread_func(void *);
int factors[MAX_ARRAY];
int main(int argc, char *argv[]) {
pthread_t thread_handle[argc];
int i;
int g;
// Create Children Threads
for ( i = 0; i < argc; i++ ) {
pthread_create(&thread_handle[i], NULL, thread_func, &argv[i + 1]);
}
// Rejoin Threads
for ( i = 0; i < argc; i++ ) {
pthread_join(thread_handle[i], NULL);
// Print Factors Here
printf("%d: ", atoi(argv[i]));
for ( g = 0; g < MAX_ARRAY; g++ ) {
printf("%d, ", factors[g]);
}
printf("\n");
for ( g = 0; g < MAX_ARRAY; g++ ) {
factors[g] = 0;
}
}
return 0;
}
void *thread_func(void *data) {
int n = atoi(data);
int x;
int v;
printf("Number to factor is: %d\n", n);
for ( x = 1; x <= n; ++x ) {
if (n%x == 0)
factors[v++] = x;
}
return NULL;
}
【问题讨论】:
-
我没有在您的代码中看到任何强制转换,也没有任何理由认为您应该需要它们。
-
在 thread_func 中我必须取消引用传入的值,该值是一个 void 指针。我必须将它从 void* 转换为 integer* 或我可以取消引用的东西。
-
@user3208991:不,指针指向命令行中的字符串。您只需将其传递给
atoi(就像您正在做的那样)将字符串解释为十进制数。 -
你的代码中的问题是无关的。
v未初始化使用,factors是全局的,所有线程都可以访问,无需任何同步。我不确定你想在那里做什么...... -
我试图让每个线程访问同一个数组并将其因子插入其中。一旦一个线程这样做并加入,它就会从数组中打印它的因子,然后当下一个线程运行时,它会覆盖前一个线程的数字并做同样的事情。