创建动态数量的线程

6

我想要创建由用户指定数量的线程。我编写的代码如下:

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);
}   

这是否正确?


为什么? 为什么要创建由用户定义的线程数量?只需获得完成工作所需的线程数即可。 - Ed Heal
2
因为用户应该指定并发线程的数量... 因为这是我们设计此项目的方式... - Alessandroempire
2个回答

7
是的,但我会做以下操作:
  1. 在调用atoi(argv[1])之前验证argc>1

  2. 验证numberOfThreads是正数且小于合理范围。 (以防用户键入1000000)。

  3. 验证malloc的返回值不为null。

  4. pthread_create失败时不会设置errno。 因此,在失败时可能不是正确的函数调用perror。

...

if (argc > 1)
{
    int numberOfThreads = atoi(argv[1]); 
    if ((numberOfThreads <= 0) || (numberOfThreads > REASONABLE_THREAD_MAX))
    {
        printf("invalid argument for thread count\n");
        exit(EXIT_FAILURE);
    }
 
    thread = malloc(sizeof(pthread_t)*numberOfThreads); 
    if (thread == NULL)
    {
       printf("out of memory\n");
       exit(EXIT_FAILURE);
    }

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

忘记检查malloc了。检查argc是个不错的补充。谢谢。 - Alessandroempire

4
#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> 为什么要进行malloc操作?

2> 如果进行了malloc操作,为什么不进行free操作呢?


编译时抛出错误...我之前尝试过,它会抛出警告,这就是为什么我使用了malloc的原因。 - Alessandroempire
padre.c:12:5: 警告:ISO C90禁止变长数组'thread_id' padre.c:70:2: 警告:从不兼容的指针类型传递参数1给'pthread_create' /usr/include/pthread.h:225:12: 注意:期望类型为'pthread_t * restrict'的参数1,但实参的类型为'pthread_t **' padre.c:80:2: 警告:从不兼容的指针类型传递参数1给'pthread_create' /usr/include/pthread.h:225:12: 注意:期望类型为'pthread_t * restrict'的参数1,但实参的类型为'pthread_t **' padre.c:89:7: 警告:传递参数1给'pthread_join'时将指针转换为整数 - Alessandroempire
在 C90 中,我认为不允许使用 VLA,在 C99 中则允许。这就是为什么你会得到警告的原因。参见:https://dev59.com/VnA75IYBdhLWcg3w0st- - Jeegar Patel
我明白了。那样的话是有效的。我会尝试一下。 - Alessandroempire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接