2012-06-22 5 views
4

Я хочу создать несколько потоков, заданных пользователем. Код, который я написал для этого, это:Создать динамическое число потоков

int nhijos = atoi(argv[1]); 

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

for (i = 0; i < nhijos; i++){ 
    if (pthread_create (&thread[i], NULL, &hilos_hijos, (void*) &info) != 0){ 
    perror("Error al crear el hilo. \n"); 
    exit(EXIT_FAILURE); 
} 

Это правильно?

+0

ПОЧЕМУ? Почему вы создаете несколько потоков, определенных пользователем? Просто получите количество потоков, необходимых для выполнения работы. –

+0

, потому что пользователь должен указать количество параллельных потоков ... потому что это то, как мы предполагаем, чтобы запрограммировать этот проект ... – Alessandroempire

ответ

6

Да, но я хотел бы сделать следующие действия:

  1. проверить, что ARGC> 1 перед вызовом atoi (ARGV [1])

  2. проверить, что nhijos является положительным числом и меньше разумный диапазон. (В случае, если пользователь вводит 1000000).

  3. Подтвердить возвращаемое значение из malloc не равно нулю.

  4. pthread_create не будет устанавливать errno при сбое. Таким образом, perror, возможно, не является подходящей функцией для вызова отказа.

...

if (argc > 1) 
{ 
    int nhijos = atoi(argv[1]); 
    if ((nhijos <= 0) || (nhijos > REASONABLE_THREAD_MAX)) 
    { 
     printf("invalid argument for thread count\n"); 
     exit(EXIT_FAILURE); 
    } 

    thread = malloc(sizeof(pthread_t)*nhijos); 
    if (thread == NULL) 
    { 
     printf("out of memory\n"); 
     exit(EXIT_FAILURE); 
    } 

    for (i = 0; i < nhijos; i++) 
    { 
     if (pthread_create (&thread[i], NULL, &hilos_hijos, (void*) &info) != 0) 
     { 
      printf("Error al crear el hilo. \n"); 
      exit(EXIT_FAILURE); 
     }  
    } 
+0

забыл проверить malloc. и приятное дополнение для проверки argc. благодаря – Alessandroempire

3
#include<stdio.h> 
#include<pthread.h> 

void* thread_function(void) 
{ 
    printf("hello"); 
} 
int main(int argc,char *argv[]) 
{ 
    int noOfThread= atoi(argv[1]); 
    pthread_t thread_id[noOfThread]; 
    int i; 
    int status; 
    for(i=0;i<noOfThread;i++) 
    { 
     pthread_create (&thread_id[i], NULL , &thread_function, NULL); 
    } 

    for(i=0;i<noOfThread;i++) 
     pthread_join(thread_id[i],NULL); 
} 

Теперь компилируем Тхи и работать как

./a.exe 3 

Так 3 будет создан поток


В коде

1> почему вы собираетесь таНос?

2> Если malloc тогда, почему вы не собираетесь это освобождать?

+0

throws erros при компиляции ... Я пробовал это раньше, и он выдает предупреждения, вот почему я использовал malloc – Alessandroempire

+0

Может ли у вас что-нибудь сделать? –

+0

padre.c: 12: 5: предупреждение: ISO C90 запрещает массив переменной длины 'thread_id' padre.c: 70: 2: warning: передающий аргумент 1 из 'pthread_create' из несовместимого указателя типа /usr/include/pthread. h: 225: 12: note: expected 'pthread_t * __restrict__', но аргумент имеет тип 'pthread_t **' padre.c: 80: 2: warning: передать аргумент 1 из 'pthread_create' из несовместимого типа указателя /usr/include/pthread.h: 225: 12: note: expected 'pthread_t * __restrict__', но аргумент имеет тип 'pthread_t **' padre.c: 89: 7: warning: передающий аргумент 1 из 'pthread_join' делает целое число из указателя без литья – Alessandroempire

Смежные вопросы