如何将整数从 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;
}