2014-12-05 5 views
1

Я пытаюсь создать pthread, и я смущен аргументами, необходимыми для его создания.pthread_create не принимает аргументы

Я пытаюсь передать несколько аргументов в функцию ввода для pthread, и я инкапсулировал это в структуру. Однако pthread_create не принимает его.

Вот соответствующие части моего кода:

Customer_Spawn_Params *params = (Customer_Spawn_Params*) malloc(sizeof(Customer_Spawn_Params)); 
    params->probability = chance; 
    params->queue = queue; 

    pthread_t customer_spawn_t; 
    if (pthread_create(&customer_spawn_t, NULL, enqueue_customers, &params)) { 
    } 

А вот Customer_Spawn_Params структура:

typedef struct { 
     Queue *queue; 
     double probability; 
} Customer_Spawn_Params; 

Наконец, вот enqueue_customers(), которая принимает указатель на Customer_Spawn_Params структуры:

void *enqueue_customers(Customer_Spawn_Params *params) { 
     int customer_id = 0; 
     double probability = params->probability; 
     Queue *queue = params->queue; 
     while(true) { 
       sleep(1); 
       bool next_customer = next_bool(probability); 
       if (next_customer) { 
         Customer *customer = (Customer*) malloc(sizeof(Customer)); 
         customer->id = customer_id; 
         enqueue(queue, customer); 
         customer_id++; 
       } 
     } 
     return NULL; 
} 
+0

'Однако, pthread_create не принимает его.' .. Как вы пришли к такому выводу? –

+0

При вызове 'pthread_create' вы передаете последний указатель (аргумент функции потока) в качестве указателя * на указатель *. Если вы не измените свою функцию потока, у вас будет [* неопределенное поведение *] (http://en.wikipedia.org/wiki/Undefined_behavior). –

+0

введите свой параметр в (void *), и ваш поток proc должен принять void * – dvhh

ответ

2

Пункт 1.

if (pthread_create(&customer_spawn_t, NULL, enqueue_customers, &params))

изменение

if (pthread_create(&customer_spawn_t, NULL, enqueue_customers, params)).

Потому что, params - это указатель сам.

Пункт 2:

Кроме того,

void *enqueue_customers(Customer_Spawn_Params *params) 

должен быть

void *enqueue_customers(void *params) 

В функции, вы должны типаж его обратно к реальному указателю, например,

void *enqueue_customers(void *params) 
{ 
    Customer_Spawn_Params *p = params; 
+0

, пожалуйста, не бросайте 'void *' на что-то. Это совершенно лишнее и может фактически скрыть проблемы. –

+0

@JensGustedt ОК сэр, спасибо. Можете ли вы прокомментировать или ссылку на сообщение, которое немного отличается (возможно, с небольшим примером)? –

+0

с удовольствием :) https://gustedt.wordpress.com/2014/04/02/dont-use-casts-i/ –

2

Ваша функция enqueue_customers не имеет правильного прототипа. Он должен быть

void *enqueue_customers(void* p) { 
    Customer_Spawn_Params *params = p; 
    ... 
Смежные вопросы