16

各スレッドが素数を計算する複数のスレッドを作成しようとしています。スレッド作成を使用して、関数に2番目の引数を渡そうとしています。それはエラーを投げ続けます。

void* compute_prime (void* arg, void* arg2)
{

これが、作成スレッドを使用したmain()です。&max_primeの後の&primeArray[i]がエラーを表示します。

 for(i=0; i< num_threads; i++)
 {
    primeArray[i]=0;
    printf("creating threads: \n");
    pthread_create(&primes[i],NULL, compute_prime, &max_prime, &primeArray[i]);
    thread_number = i;
    //pthread_create(&primes[i],NULL, compPrime, &max_prime);
 }

 /* join threads */
 for(i=0; i< num_threads; i++)
{
    pthread_join(primes[i], NULL);
    //pthread_join(primes[i], (void*) &prime);
    //pthread_join(primes[i],NULL);
    //printf("\nThread %d produced: %d primes\n",i, prime);
    printf("\nThread %d produced: %d primes\n",i, primeArray[i]);
    sleep(1);
}

私が得るエラーは次のとおりです。

myprime.c: In function âmainâ:
myprime.c:123: warning: passing argument 3 of âpthread_createâ from incompatible pointer type
/usr/include/pthread.h:227: note: expected âvoid * (*)(void *)â but argument is of type âvoid * (*)(void *, void *)â
myprime.c:123: error: too many arguments to function âpthread_createâ

2番目の引数を取り除けば問題なく動作します。

4

4 に答える 4

29

新しいスレッドで呼び出している関数に渡すことができる引数は1つだけです。両方の値を保持する構造体を作成し、構造体のアドレスを送信します。

#include <pthread.h>
#include <stdlib.h>
typedef struct {
    //Or whatever information that you need
    int *max_prime;
    int *ith_prime;
} compute_prime_struct;

void *compute_prime (void *args) {
    compute_prime_struct *actual_args = args;
    //...
    free(actual_args);
    return 0;
}
#define num_threads 10
int main() {
    int max_prime = 0;
    int primeArray[num_threads];
    pthread_t primes[num_threads];
    for (int i = 0; i < num_threads; ++i) {
        compute_prime_struct *args = malloc(sizeof *args);
        args->max_prime = &max_prime;
        args->ith_prime = &primeArray[i];
        if(pthread_create(&primes[i], NULL, compute_prime, args)) {
            free(args);
            //goto error_handler;
        }
    }
    return 0;
}
于 2012-10-30T02:53:39.323 に答える
0

std :: threadの場合、ユーザーは次のメソッドでスレッド関数に引数を渡すことができます

std :: thread(funcName、arg1、arg2);

例えば、

//for a thread function, 
void threadFunction(int x,int y){
   std::cout << x << y << std::endl;
}

// u can pass x and y values as below
std::thread mTimerThread;
mTimerThread = std::thread(threadFunction,1,12);
于 2017-07-13T12:35:44.987 に答える
0

これはManakarseのコードです、すべてが本当に良いですが、あなたは

pthread_join(thread [i]、NULL)

メインスレッドが終了する前にすべてのスレッドが正常に実行されることを確認するためだけに(「メインは、すべてのスレッドがまだ終了していない間、「待機中」になります);

于 2018-12-19T21:11:21.050 に答える
-1
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct 
{
    int stop_flag;
    char name[30];
} _process_data;

typedef struct 
{
    int meter_no;
    int port_no;
} _process_control;

typedef struct 
{
   _process_data *process_data;
   _process_control *process_control;
} compute_prime_struct;

void *compute_prime (void *args) 
{
    compute_prime_struct *actual_args = args;
      printf("actual_args->process_data->stop_flag [%d]\n",actual_args->process_data->stop_flag);
      printf("actual_args->process_data->name [%s]\n",actual_args->process_data->name);
      printf("actual_args->process_control->meter_no [%d]\n",actual_args->process_control->meter_no);
      printf("actual_args->process_control->port_no [%d]\n",actual_args->process_control->port_no);
    free(actual_args);
    return 0;
}
void fill_data(_process_data *process_data,_process_control *process_control)
{
    process_data->stop_flag=1;
    process_data->name[0]='P';
    process_control->meter_no=6;
    process_control->port_no=22;
    
    pthread_t tid;
    
    compute_prime_struct *args = malloc(sizeof (*args));
    args->process_data = malloc(sizeof (*args->process_data));
    args->process_control = malloc(sizeof (*args->process_control));

    memcpy (args->process_data, process_data, sizeof (args->process_data));
    memcpy (args->process_control, process_control, sizeof (*args->process_control));
        
        if(pthread_create(&tid, NULL, compute_prime, args)) 
        {
            free(args);
            printf("Error here");
        }
        sleep(1);
}

int main() 
{
     _process_data process_data;
     _process_control process_control;
     
     fill_data(&process_data,&process_control);
    return 0;
}
于 2021-05-31T17:03:41.300 に答える