tags:

views:

42

answers:

3

I am writting an application that has multiple threads in Linux environment using C or python. I am using pthread for that. But How number of threads should be accepted via command line.

+2  A: 

If you were using a threading framework like OpenMP, then this is all handled automatically simply by setting the environment variable OMP_NUM_THREADS.

But if you're implementing threads "manually", you'll need to do it the way most runtime configuration is done: either by parsing argv[], or by setting an environment variable and using getenv().

Oli Charlesworth
+2  A: 

In C you handle command line arguments by having main take two arguments,

int main(int argc, char** argv)

in which argc is the number of command line arguments (including the program itself) and argv is a pointer to a memory location where argc-1 pointers to strings with the actual arguments are located. Example:

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

Let's now assume that your program takes a single command line argument, an integer telling you how many threads to spawn. The integer is given as a string, so we have to convert it using 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;
}

Now what you do is simply create an array of thread handles,

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

and use it to store the thread handles as you start num_threads number of threads using pthread_create.

If you are not familiar with pthreads at all, I recommend this short tutorial.

gspr
threads = malloc(num_threads*sizeof(pthread_t)); tr = pthread_create( passing argument 1 of ‘pthread_create’ from incompatible pointer type (warning it shows)
Tauquir
thanks, Yes i am not familiar with pthread.how should i do for sleep for random intervals Once awake, write its own name in the string
Tauquir
gspr
I would post your question about sleeping and waking at random intervals as a separate stackoverflow question.
gspr
+1  A: 

Usually, you would just pass it like any other argument. I've used code similar to the following in projects before to specify fixed thread counts. This is fairly simple but suitable for situations where you don't need the full power of thread pooling (though you could just as easily set a minimum and maximum thread count the same way).

#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;
    }
    :
    :
paxdiablo
Minor stylistic quibble: Isn't it standard practice to always use `argc` and `argv`, for clarity and consistency?
Oli Charlesworth
Actually I normally use `argCount` and `argVal` since I prefer more readable names (the same reason I rarely use `i` as a counter in real code), but I was in a hurry :-)
paxdiablo