2011-02-10 25 views
8

Tôi đang cố gắng viết một chương trình đa luồng, số lượng luồng dựa trên đầu vào dòng lệnh và vì vậy tôi không thể tạo các chuỗi được khai báo trước. Đây có phải là cách hợp lệ để làm điều đó không?Làm thế nào để đẻ trứng n đề?

int threads = 5; // (dynamic, not hard-coded) 
int i = 0; 
pthread_t * thread = malloc(sizeof(pthread_t)*threads); 

for (i = 0; i < threads; i++) { 
    pthread_t foobar; 
    thread[i] = foobar; // will this cause a conflict? 
} 

for (i = 0; i < threads; i++) { 

    int ret = pthread_create(&thread[i], NULL, (void *)&foobar_function, NULL); 

    if(ret != 0) { 
     printf ("Create pthread error!\n"); 
     exit (1); 
    } 
} 

Dưới đây là kết quả của tôi từ sửa đổi đề nghị dưới đây. Dường như làm việc tốt.

int threads = 5; 
int i; 

pthread_t * thread = malloc(sizeof(pthread_t)*threads); 

for (i = 0; i < threads; i++) { 

    int ret = pthread_create(&thread[i], NULL, &foobar_function, NULL); 

    if(ret != 0) { 
     printf ("Create pthread error!\n"); 
     exit (1); 
    } 
    // pthread_join(thread[i], NULL); // don't actually want this here :) 
} 

sleep(1);  // main() will probably finish before your threads do, 
free(thread); // so we'll sleep for illustrative purposes 
+2

bạn không thể chỉ định một số nguyên cho một chuỗi trong 'int threads = argv [3]' bit. Bạn phải sử dụng 'atoi' hoặc sscanf –

+0

cảm ơn, bạn nói đúng. đã sửa. –

+0

Vâng, với 'pthread_join()' ở vị trí của nó, bạn sẽ tạo ra một chuỗi, và sau đó đợi nó kết thúc trước khi sinh ra cái tiếp theo. Vì vậy, trong thực tế, bạn sẽ được bán đơn luồng ở đây :) –

Trả lời

7

Có gì trong chu kỳ đầu tiên? Liệu nó có đặt các phần tử mảng thành uninitialized giá trị không?

Vì vậy, tôi nghĩ rằng đó là những gì bạn cần:

int threads = 5, i = 0, ret = -1; 

pthread_t * thread = malloc(sizeof(pthread_t)*threads); 

for (i = 0; i < threads; i++) { 

    ret = pthread_create(&thread[i], NULL, &foobar_function, NULL); 

    if(ret != 0) { 
     printf ("Create pthread error!\n"); 
     exit (1); 
    } 
} 

Chúng đẻ trứng đề đề, bắt đầu foobar_function trong mỗi. Và bạn có (nếu mọi thứ suôn sẻ :)) id của họ trong chủ đề mảng. Vì vậy, ví dụ bạn có thể hủy chuỗi thứ hai bằng cách gọi số pthread_cancel(thread[1]) v.v.

+0

@Brian D: Hàm cho chuỗi bạn chỉ định làm tham số thứ ba cho 'pthread_create()'. –

+0

Vâng, tôi tin rằng đó là những gì tôi đang cố gắng làm. Trong ví dụ tôi đang theo dõi, vì nó là số pthreads tĩnh, chúng chỉ viết 'pthread_t t1;' và 'pthread_t t2;' và sau đó khởi tạo chúng sau hai hàm khác nhau, vì vậy tôi đang cố gắng tìm ra cách tự động tạo chuỗi n. –

+0

@Brian D: Vì vậy, chỉ cần bỏ qua phần đó (vì bản chất của pthread_t là không xác định, người ta không thể đặt nó thành bất kỳ loại không xác định). Bạn nhận được các chủ đề 'id (và bắt đầu các chủ đề quá) trong chu kỳ thứ hai. –

1

Vòng đầu tiên for không hợp lệ C và tôi không chắc chắn bạn muốn làm gì. Chỉ cần loại bỏ nó và phần còn lại của mã trông ok, ngoài các diễn viên không chính xác trên foobar_function. Dàn diễn viên phải là:

(void *(*)(void *))foobar_function 

nhưng trừ khi loại này đã hoặc thứ này rất gần, chương trình của bạn có thể có hành vi không xác định. Nó sẽ là tốt hơn để sửa chữ ký chức năng vì vậy không có diễn viên là cần thiết.

+0

vâng, bạn nói đúng, cảm ơn. –

-2

Nếu bạn đang cố gắng viết chương trình đa luồng, nhưng không hiểu cách phân bổ cấu trúc dữ liệu có kích thước động, bạn có thể đang làm mọi thứ sai.

Học cách đi bộ trước khi bạn chạy.

Cân nhắc sử dụng ngôn ngữ dễ dàng hơn và tránh sử dụng các chuỗi (rõ ràng).

Chủ đề rất khó sử dụng đúng; mảng động có kích thước rất dễ đạt được (thậm chí khá dễ dàng trong C)

+0

Có ít sự lựa chọn trong ngôn ngữ hoặc sử dụng các chủ đề rõ ràng khi đó là bài tập về nhà :) –

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