2011-08-09 31 views
14

Tôi đang tạo một tệp c cho hàng đợi công văn nhận nhiệm vụ và đặt nó vào hàng đợi là danh sách được liên kết. Để thực hiện việc này, tôi cần phải tạo chủ đề bằng cách sử dụngC, cách tạo chủ đề bằng chức năng pthread_create

pthread_t cThread; 
if(pthread_create(&cThread, NULL, work, param)){ 
    perror("ERROR creating thread."); 
} 

Tuy nhiên, tôi cần phải thực hiện một hàm khác đi vào biến 'làm việc' và 'param' làm thông số của hàm tạo. Người bạn của tôi nói với tôi rằng tôi chỉ cần đặt bất kỳ mã nào vào hàm làm việc mà vòng lặp vô hạn sao cho luồng không chết .. Bất cứ ai có thể giải thích từng tham số đi vào hàm pthread_create - đặc biệt là cho workparam? Tôi đã tìm kiếm Google cho điều này, nhưng hầu hết các hướng dẫn rất khó để hiểu được khái niệm ...

+0

http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_create.html – miku

+0

tôi đọc nó. Tôi chỉ muốn ai đó giải thích cho tôi trong câu - mỗi thông số là gì cho – Leanne

Trả lời

23

Bốn tham số để pthread_create là, theo thứ tự:

  1. Một con trỏ đến một cấu trúc pthread_t, mà pthread_create sẽ điền thông tin về chủ đề mà nó tạo ra.

  2. Con trỏ đến số pthread_attr_t với thông số cho chuỗi. Bạn có thể an toàn chỉ cần vượt qua NULL hầu hết thời gian.

  3. Một chức năng chạy trong chuỗi. Hàm phải trả về void * và tham số void * mà bạn có thể sử dụng tuy nhiên bạn thấy phù hợp. (Ví dụ: nếu bạn đang bắt đầu nhiều chuỗi có cùng chức năng, bạn có thể sử dụng tham số này để phân biệt chúng.)

  4. void * mà bạn muốn bắt đầu chuỗi. Vượt qua NULL nếu bạn không cần. câu trả lời

16

làm rõ duskwuff của:

work tham số là một con trỏ hàm. Hàm nên lấy một đối số được chỉ định là loại void * và giá trị trả về void *.

param được mong đợi là con trỏ đến dữ liệu mà work sẽ nhận được.

Ví dụ: giả sử bạn muốn chuyển hai int cho người lao động. Sau đó, bạn có thể tạo một cái gì đó như thế này:

int *param = (int *)malloc(2 * sizeof(int)); 
param[0] = 123; 
param[1] = 456; 
pthread_create(&cThread, NULL, work, param); 

Sau đó, chức năng công việc của bạn có thể chuyển đổi các loại con trỏ và lấy dữ liệu param:

void *work(void * parm) { 
    int *param = (int *)parm; 
    int first_val = param[0]; 
    .... 
} 

Bạn có thể làm những thứ phức tạp hơn, như tạo một cấu trúc với tất cả dữ liệu bạn cần phải vượt qua.

+6

Vui lòng không truyền các giá trị trả lại từ 'malloc'. Sự trở lại của nó là 'void *' và luôn có thể gán cho bất kỳ con trỏ dữ liệu nào. Tương tự với 'parm'. –

+0

@Jens thói quen xấu từ C++: / –

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