Как число потоков должно быть принято через командную строку, используя pthread? - PullRequest
1 голос
/ 05 октября 2010

Я пишу приложение, которое имеет несколько потоков в среде Linux, используя C или Python. Я использую pthread для этого. Но как количество потоков должно быть принято через командную строку.

Ответы [ 3 ]

2 голосов
/ 05 октября 2010

В 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, я рекомендую это краткое руководство .

2 голосов
/ 05 октября 2010

Если вы использовали многопоточную инфраструктуру, такую ​​как OpenMP , то все это обрабатывается автоматически, просто устанавливая переменную окружения OMP_NUM_THREADS.

Но если вы реализуете потоки "вручную"вам нужно будет сделать это так, как выполняется большинство настроек времени выполнения: либо путем анализа argv[], либо путем установки переменной среды и использования getenv().

1 голос
/ 05 октября 2010

Обычно вы просто передаёте это как любой другой аргумент. Я использовал код, подобный следующему в проектах, прежде чем указывать фиксированное число потоков. Это довольно просто, но подходит для ситуаций, когда вам не нужна полная мощность пула потоков (хотя вы можете так же легко установить минимальное и максимальное число потоков одинаково).

#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;
    }
    :
    :
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...