如何从argv将整数传递给pthread_create函数? (C)

时间:2015-02-07 03:12:35

标签: c casting pthreads argv

对于这个程序,我通过命令行传入数字,然后有一个多线程程序,它接受每个参数,计算其因子,然后打印它们。我知道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;
    }

1 个答案:

答案 0 :(得分:1)

问题是每个线程对因子使用相同的数组,没有任何同步。但是如果每个线程在运行之前必须为数组锁定,它们实际上会按顺序运行,这会破坏线程的目的。

顺便说一句,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;
}