2012-10-30 38 views
7

Tôi đang cố gắng tạo nhiều luồng mà mỗi chuỗi tính toán số nguyên tố. Tôi đang cố gắng để vượt qua một đối số thứ hai cho một chức năng bằng cách sử dụng tạo thread. Nó tiếp tục ném lên các lỗi.tạo chủ đề - đối số truyền

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

đây là chính() của tôi với chuỗi tạo. & primeArray [i] sau & max_prime đang cho tôi lỗ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); 
} 

lỗi tôi nhận được là:

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â 

Nó hoạt động tốt nếu tôi đưa ra đối số thứ hai.

+0

thấy trả lời dưới đây, cũng kiểm tra [link] (https://computing.llnl.gov/tutorials/pthreads/#References) cho một trang web tài liệu tham khảo pthread tốt. – NickO

Trả lời

14

Bạn chỉ có thể chuyển một đối số cho hàm mà bạn đang gọi trong chuỗi mới. Tạo một cấu trúc để giữ cả hai giá trị và gửi địa chỉ của cấu trúc.

#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; 
} 
1

Trong trường hợp std :: chủ đề, người dùng có thể truyền tham số cho chức năng thread bằng phương pháp sau

std :: ren (funcname, arg1, arg2);

ví dụ,

//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); 
Các vấn đề liên quan