我正在寫一個應用程序,它在使用C或python的Linux環境中有多個線程。我正在使用pthread。但是如何通過命令行接受多少個線程。如何通過命令行使用pthread接受多少線程?
回答
在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。
如果您使用的是線程框架,如OpenMP,那麼只需設置環境變量OMP_NUM_THREADS
即可自動處理。
但是,如果您要「手動」實現線程,則需要按照大多數運行時配置完成的方式執行:通過解析argv[]
或設置環境變量並使用getenv()
。
通常情況下,您可以像其他任何參數一樣傳遞它。我在之前的項目中使用類似於以下代碼來指定固定線程數。這非常簡單,但適用於不需要線程池的全部功能的情況(儘管您可以用同樣的方法輕鬆設置最小和最大線程數)。
#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;
}
:
:
微小風格的狡辯:爲了清晰和一致,總是使用'argc'和'argv'不是標準做法嗎? – 2010-10-05 09:59:18
其實我通常使用'argCount'和'argVal',因爲我更喜歡更可讀的名稱(這與我在實際代碼中很少使用'i'作爲計數器的原因相同),但我很着急:-) – paxdiablo 2010-10-05 10:09:06
- 1. 如何讓程序在命令行接受glob(通配符)?
- 2. 如何通過命令行使用MSDeploy?
- 3. pthread多線程
- 4. 通過命令行程序使用forfiles
- 5. 通過pthread跨多臺計算機運行線程?
- 6. 如何通過命令行
- 7. 如何通過命令行
- 8. 如何通過命令行
- 9. 如何通過命令行
- 10. 如何通過命令行參數來線程函數
- 11. 如何讓HTA應用程序接受命令行參數?
- 12. 如何讓jenkins通過xmpp接受命令?
- 13. 如何通過命令行選擇多個網絡連接?
- 14. 多線程設置線程數量通過命令行參數或
- 15. rsync命令在命令行中最多接受2個參數
- 16. 如何使用Python接受命令行參數<
- 17. 如何在Java中使用命令行參數來接受值
- 18. 如何使用Ant接受可選的命令行參數?
- 19. 如何通過URL鏈接,使在命令行空格
- 20. 通過命令行應用程序
- 21. 如何通過命令行用硒罐子運行Java程序
- 22. 我希望我的程序通過命令行接受文件路徑
- 23. 如何在Windows命令行中通過WSL調用Linux命令?
- 24. 通過命令行
- 25. 通過命令行
- 26. 通過命令行
- 27. 通過命令行
- 28. 通過命令行
- 29. 通過命令行
- 30. 通過命令行
threads = malloc(num_threads * sizeof(pthread_t)); tr = pthread_create(&threads,NULL,NULL,NULL);從不兼容的指針類型傳遞參數1(警告它顯示) – Tauquir 2010-10-05 11:11:55
謝謝,是的我不熟悉pthread.how我應該爲睡眠做隨機間隔一旦醒來,在字符串中寫入自己的名字 – Tauquir 2010-10-05 11:13:45
關於代碼在你的評論中:&線程表示指針線程的地址。當創建第i個線程時,您需要&線程[i](數組線程的第i個元素的地址)。 – gspr 2010-10-05 12:03:12