Trình biên dịch sẽ phàn nàn nếu bạn không đúc i
vào con trỏ trống:
pthread_create(&thread_tid[i], NULL, collector, (void*)i);
Điều đó nói rằng, đúc một số nguyên cho một con trỏ là không nghiêm chỉnh an toàn:
ISO/IEC 9899: 201x 6.3.2.3 Pointers
- Một số nguyên có thể được chuyển đổi thành bất kỳ loại con trỏ nào. Ngoại trừ như được chỉ định trước đây, kết quả được xác định thực hiện, có thể không được căn chỉnh chính xác, có thể không trỏ đến một thực thể thuộc loại được tham chiếu và có thể là biểu diễn bẫy.
vì vậy bạn nên bỏ qua một con trỏ riêng biệt cho từng chuỗi.
Dưới đây là một ví dụ làm việc đầy đủ, mà vượt qua mỗi thread một con trỏ đến một yếu tố riêng biệt trong một mảng:
#include <pthread.h>
#include <stdio.h>
void * collector(void* arg)
{
int* a = (int*)arg;
printf("%d\n", *a);
return NULL;
}
int main()
{
int i, id[10];
pthread_t thread_tid[10];
for(i = 0; i < 10; i++) {
id[i] = i;
pthread_create(&thread_tid[i], NULL, collector, (void*)(id + i));
}
for(i = 0; i < 10; i++) {
pthread_join(thread_tid[i], NULL);
}
return 0;
}
Có một giới thiệu tốt đẹp để pthreads here.
Nguồn
2013-10-26 02:05:09
Không hiệu quả đối với tôi. Có chỉ mục chưa được khởi tạo. Điều này đã làm công việc mặc dù: pthread_create (& thread_tid [i], NULL, bộ sưu tập, (void *) (id [i])); Thiếu – Vardit