2012-06-28 26 views
5

tôi đang cố gắng để tạo ra một chủ đề và từ những gì tôi nhớ điều này nên là đúng cách để làm điều đó:pthread_create không hoạt động. đi qua lập luận 3 cảnh báo

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#define NUM_THREADS 5 

int SharedVariable =0; 
void SimpleThread(int which) 
{ 
    int num,val; 
    for(num=0; num<20; num++){ 
     if(random() > RAND_MAX/2) 
      usleep(10); 
     val = SharedVariable; 
     printf("*** thread %d sees value %d\n", which, val); 
     SharedVariable = val+1; 
    } 
    val=SharedVariable; 
    printf("Thread %d sees final value %d\n", which, val); 
} 

int main (int argc, char *argv[]) 
{ 
    pthread_t threads[NUM_THREADS]; 
    int rc; 
    long t; 
    for(t=0; t< NUM_THREADS; t++){ 
     printf("In main: creating thread %ld\n", t); 
     rc = pthread_create(&threads[t], NULL, SimpleThread, (void*)t); 
     if (rc){ 
     printf("ERROR; return code from pthread_create() is %d\n", rc); 
     exit(-1); 
     } 
    } 

    /* Last thing that main() should do */ 
    pthread_exit(NULL); 
} 

Và lỗi mà tôi nhận được là một trong những điều này:

test.c: Trong hàm 'main': test.c: 28: warning: đối số truyền 3 của 'pthread_create' từ loại con trỏ không tương thích /usr/include/pthread.h:227: note: expected 'void * (* ) (void *) 'nhưng đối số là loại' void (*) (i nt) ’

Tôi không thể thay đổi chức năng SimpleThread để thay đổi loại tham số không phải là tùy chọn mặc dù tôi đã thử và không hoạt động.

Tôi đang làm gì sai?

Trả lời

12

SimpleThread nên được khai báo là

void* SimpleThread(void *args) { 
} 

Khi bạn vượt qua các thông số quan đến chủ đề của bạn, tốt nhất là để xác định một struct cho họ, vượt qua một con trỏ đến đó struct như void*, và đúc trở lại đúng loại bên trong hàm.

+0

Tôi đã thử làm điều đó nhưng sau đó tôi nhận được lỗi mỗi khi tôi sử dụng int mà – randomizertech

+1

@ fgualda87 Là một bộ đếm thời gian nhanh, bạn có thể chuyển 'int' thành' void * '- chỉ để đảm bảo mã của bạn hoạt động. Thêm 'int which = (int) args;', và mã nên biên dịch và chạy. Bạn nên xem xét gói 'int' trong một' struct', mặc dù. – dasblinkenlight

+0

Hoàn hảo nó hoạt động! Có cách nào để làm điều này mà không thay đổi phương thức SimpleThread? – randomizertech

3

Đây là phiên bản biên dịch và "đang hoạt động" của chương trình, mặc dù tôi phải thừa nhận là không biết chính xác nó đang làm gì. Đối với các nhà phê bình trong khán giả, tôi xin lỗi trước cho vòng lặp pthread_join ở cuối.

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

#define NUM_THREADS 5 

struct my_thread_info { 
    long which; 
}; 

int SharedVariable = 0; 

void *SimpleThread(void *data) 
{ 
    int num, val; 
    struct my_thread_info *info = data; 

    for (num = 0; num < 20; num++) { 
     if (random() > RAND_MAX/2) 
      usleep(10); 
     val = SharedVariable; 
     printf("*** thread %ld sees value %d\n", info->which, val); 
     SharedVariable = val + 1; 
    } 

    val = SharedVariable; 
    printf("Thread %ld sees final value %d\n", info->which, val); 

    free(info); 
    return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
    pthread_t threads[NUM_THREADS]; 
    int rc; 
    long t; 
    struct my_thread_info *info; 
    for (t = 0; t < NUM_THREADS; t++) { 
     printf("In main: creating thread %ld\n", t); 

     info = malloc(sizeof(struct my_thread_info)); 
     info->which = t; 

     rc = pthread_create(&threads[t], NULL, SimpleThread, info); 
     if (rc) { 
      printf("ERROR; return code from pthread_create() is %d\n", rc); 
      exit(-1); 
     } 
    } 

    for (t = 0; t < NUM_THREADS; t++) { 
     pthread_join(threads[t], NULL); 
    } 
} 
+0

tính năng này có hoạt động không? Hàm SimpleThread của bạn không trả về. – IanNorton

+0

Kỳ lạ, vâng. Tôi sẽ thêm nó mặc dù. –

+0

Không, điều này thay đổi phương thức SimpleThread của tôi quá nhiều. Cảm ơn mặc dù! – randomizertech

Các vấn đề liên quan