2010-10-05 24 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