如何将整数从 argv 传递到 pthread_create 函数? (C)
How do I pass an integer into the pthread_create function from argv? (C)
对于这个程序,我通过命令行传入数字,然后有一个多线程程序接受每个参数,计算其因子,然后打印它们。我知道 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;
}
问题是每个线程都使用相同的数组作为因子,没有任何同步。但是,如果每个线程都必须在 运行ning 之前为数组获取锁,它们实际上会按顺序全部 运行,这将破坏线程化的目的。
顺便说一句,argv[0] 是程序名称,您应该跳过它。
你应该做的是为每个线程设置一个不同的因子数组,这样它们就可以独立工作,互不干扰。您还应该在主线程中进行所有显示,以控制打印内容的顺序。
因为最好按顺序显示因素,所以应该先创建所有线程,然后加入所有线程,最后显示结果。
这里和那里也有一些小错误,比如一个错误或未初始化的变量。
这是更正后的版本:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define MAX_ARRAY 17
typedef struct {
int factors[MAX_ARRAY];
int n;
} thread_data;
void * thread_func (void *);
int main (int argc, char *argv[]) {
int n = argc - 1;
pthread_t thread_handle[n];
thread_data thread_data_table[n];
int i;
// Create Children Threads
for (i = 0; i < n; i++ ) {
thread_data_table[i].n = atoi (argv[i + 1]);
pthread_create(&thread_handle[i], NULL, thread_func,
&thread_data_table[i]);
}
// Join Threads
for (i = 0; i < n; i++ ) {
pthread_join(thread_handle[i], NULL);
}
// Print Factors
for (i = 0; i < n; i++) {
int j;
printf("%d: ", thread_data_table[i].n);
for (j = 0; j < MAX_ARRAY; j++ ) {
int x = thread_data_table[i].factors[j];
if (x == 0) {
break;
}
printf("%d, ", x);
}
printf("\n");
}
return 0;
}
void * thread_func (void *data)
{
thread_data *p = (thread_data*)data;
int i;
int count = 0;
for (i = 1; i <= p->n; ++i ) {
if (p->n % i == 0) {
if (count == MAX_ARRAY) {
break;
}
p->factors[count++] = i;
}
}
if (count < MAX_ARRAY) {
p->factors[count] = 0;
}
return NULL;
}
对于这个程序,我通过命令行传入数字,然后有一个多线程程序接受每个参数,计算其因子,然后打印它们。我知道 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;
}
问题是每个线程都使用相同的数组作为因子,没有任何同步。但是,如果每个线程都必须在 运行ning 之前为数组获取锁,它们实际上会按顺序全部 运行,这将破坏线程化的目的。
顺便说一句,argv[0] 是程序名称,您应该跳过它。
你应该做的是为每个线程设置一个不同的因子数组,这样它们就可以独立工作,互不干扰。您还应该在主线程中进行所有显示,以控制打印内容的顺序。
因为最好按顺序显示因素,所以应该先创建所有线程,然后加入所有线程,最后显示结果。
这里和那里也有一些小错误,比如一个错误或未初始化的变量。
这是更正后的版本:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define MAX_ARRAY 17
typedef struct {
int factors[MAX_ARRAY];
int n;
} thread_data;
void * thread_func (void *);
int main (int argc, char *argv[]) {
int n = argc - 1;
pthread_t thread_handle[n];
thread_data thread_data_table[n];
int i;
// Create Children Threads
for (i = 0; i < n; i++ ) {
thread_data_table[i].n = atoi (argv[i + 1]);
pthread_create(&thread_handle[i], NULL, thread_func,
&thread_data_table[i]);
}
// Join Threads
for (i = 0; i < n; i++ ) {
pthread_join(thread_handle[i], NULL);
}
// Print Factors
for (i = 0; i < n; i++) {
int j;
printf("%d: ", thread_data_table[i].n);
for (j = 0; j < MAX_ARRAY; j++ ) {
int x = thread_data_table[i].factors[j];
if (x == 0) {
break;
}
printf("%d, ", x);
}
printf("\n");
}
return 0;
}
void * thread_func (void *data)
{
thread_data *p = (thread_data*)data;
int i;
int count = 0;
for (i = 1; i <= p->n; ++i ) {
if (p->n % i == 0) {
if (count == MAX_ARRAY) {
break;
}
p->factors[count++] = i;
}
}
if (count < MAX_ARRAY) {
p->factors[count] = 0;
}
return NULL;
}