2010-10-05 21 views

回答

2

在C你通过具有main两个参数处理命令行参数,其中

int main(int argc, char** argv) 

argc是命令行参数(包括程序本身)和argv数是指向的存储器位置其中argc-1指向具有实际参数的字符串指针。例如:

int main(int argc, char** argv) 
{ 
    printf("The program was executed as %s.\n", argv[0]); 
    printf("The arguments were:\n"); 
    for (int i = 1; i < argc; i++) 
    printf("%s\n", argv[i]); 
    return 0; 
} 

现在让我们假设你的程序需要一个命令行参数,一个整数告诉你有多少个线程产卵。整数给出一个字符串,所以我们必须用atoi将其转换:

if (argc != 2) 
{ 
    printf("Need exactly one argument!\n"); 
    return 1; 
} 
int num_threads = atoi(argv[1]); // Convert first argument to integer. 
if (num_threads < 1) 
{ 
    printf("I'll spawn no less than 1 thread!\n"); 
    return 2; 
} 

现在你要做的就是简单地创建线程句柄的数组,

pthread_t* threads = malloc(num_threads*sizeof(pthread_t)); 

,并用它来存储当你开始使用线程句柄num_threads使用pthread_create的线程数。

如果您根本不熟悉pthreads,我推荐this short tutorial

+0

threads = malloc(num_threads * sizeof(pthread_t)); tr = pthread_create(&threads,NULL,NULL,NULL);从不兼容的指针类型传递参数1(警告它显示) – Tauquir 2010-10-05 11:11:55

+0

谢谢,是的我不熟悉pthread.how我应该为睡眠做随机间隔一旦醒来,在字符串中写入自己的名字 – Tauquir 2010-10-05 11:13:45

+0

关于代码在你的评论中:&线程表示指针线程的地址。当创建第i个线程时,您需要&线程[i](数组线程的第i个元素的地址)。 – gspr 2010-10-05 12:03:12

2

如果您使用的是线程框架,如OpenMP,那么只需设置环境变量OMP_NUM_THREADS即可自动处理。

但是,如果您要“手动”实现线程,则需要按照大多数运行时配置完成的方式执行:通过解析argv[]或设置环境变量并使用getenv()

1

通常情况下,您可以像其他任何参数一样传递它。我在之前的项目中使用类似于以下代码来指定固定线程数。这非常简单,但适用于不需要线程池的全部功能的情况(尽管您可以用同样的方法轻松设置最小和最大线程数)。

#include <stdio.h> 

#define THRD_DFLT 5 
#define THRD_MIN 2 
#define THRD_MAX 20 

static int numThreads = 0; 
int main (int argCount, char *argVal[]) { 
    if (argCount > 1) 
     numThreads = atoi (argVal[1]); 
    if ((numThreads < 5) || (numThreads > THRD_MAX)) { 
     printf ("Number of threads outside range %d-%d, using %d\n", 
      THRD_MIN, THRD_MAX, THRD_DFLT); 
     numThreads = THRD_DFLT; 
    } 
    : 
    : 
+2

微小风格的狡辩:为了清晰和一致,总是使用'argc'和'argv'不是标准做法吗? – 2010-10-05 09:59:18

+0

其实我通常使用'argCount'和'argVal',因为我更喜欢更可读的名称(这与我在实际代码中很少使用'i'作为计数器的原因相同),但我很着急:-) – paxdiablo 2010-10-05 10:09:06