2013-10-26 15 views
6

Tôi chỉ muốn chuyển giá trị của một số nguyên cho một chuỗi.Vượt qua giá trị số nguyên qua pthread_create

Tôi có thể làm như thế nào?

tôi đã cố gắng:

int i; 
    pthread_t thread_tid[10]; 
    for(i=0; i<10; i++) 
    { 
     pthread_create(&thread_tid[i], NULL, collector, i); 
    } 

Phương pháp đề trông như thế này:

void *collector(void *arg) 
    { 
     int a = (int) arg; 
    ... 

tôi nhận được cảnh báo sau đây:

warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 

Trả lời

6

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

  1. 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.

+0

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

0

int là 32 bit và void * là 64 bit trong 64 bit Linux; Trong trường hợp đó bạn nên sử dụng int dài thay vì int;

long int i; 
pthread_create(&thread_id, NULL, fun, (void*)i); 

int vui vẻ (void * i) chức năng

long int id = (long int) i; 
1
void *foo(void *i) { 
    int a = *((int *) i); 
    free(i); 
} 

int main { 
    int *arg = (char*)malloc(sizeof(char)) 
    pthread_create(&thread, 0, foo, arg); 
} 
+1

thiếu 'malloc' –

0

Nó tốt hơn để sử dụng một struct cho gửi nhiều tham số trong một:

struct PARAMS 
{ 
    int i; 
    char c[255]; 
    float f; 
} params; 

pthread_create(&thread_id, NULL, fun, (void*)(&params)); 

sau đó bạn có thể castparams đến PARAMS* và sử dụng nó trong pthreadroutine:

PARAMS *p = static_cast<PARAMS*>(params); 
p->i = 5; 
strcpy(p->c, "hello"); 
p->f = 45.2; 
Các vấn đề liên quan