第一次使用线程

时间:2019-03-20 15:40:21

标签: c pthreads

///试图使每个线程打印其线程号而不是id,然后从数组中打印一条消息,希望能够在pthread create中传递数组,但是现在我得到一个错误数组下标不是整数请帮助我

   #include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <pthread.h>

void * print_funtion( void* i, void* message)
{   
    printf("Thread %d: ",(int*) i);
    printf("Thread %s: ", message);

    return NULL;
}

int main(int argc, char* argv[]){
int i;
int num = atoi(argv[1]);
//printf("%d \n", num);


for(i = 1; i <= num; i++)
{


    char *messages[] = {"Hello", "Bonjour", "Hola", "Shalom", "Namaste", "Gutan Tag", "God dag","Ola", "Salut", "Napot", "Dia"};


    //printf("%d \n", i);
    pthread_t tid;
    pthread_create(&tid, NULL, print_funtion,(void*)i, (void*)messages[i]);
    pthread_join(tid,NULL);
}


return 0;
}

1 个答案:

答案 0 :(得分:2)

代码中有很多问题,我将它们分别作为注释指出:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <pthread.h>

// Note: In most cases, you should use (char *) for strings instead of char[XX].
// Note: You don't need to set the number of elements in the array 
// because it is automatically inferred from the initializer.
char *messages[] = {"Hello", "Bonjour", "Hola", "Shalom", "Namaste", "Gutan Tag", "God dag","Ola", "Salut", "Napot", "Dia"};

void *print_function(void *data)
{
  // The data you passed is int not a pointer to int.
  int i = (int)data;
  printf("Thread %d: \n", i);
  // You need to use %s for printing string.
  printf("Message: %s\n", messages[i]);
  return NULL;
}

int main(int argc, char* argv[])
{
  int i;
  int num = atoi(argv[1]);

  // Limit the number of running threads so you don't slow down you computer (10 is already too much. It depends on the number of cores you CPU has).
  #define MAX_NUM_OF_THREADS 10
  if(num > MAX_NUM_OF_THREADS)
    num = MAX_NUM_OF_THREADS;

  // I explain why we need to store the thread ids down below.
  pthread_t thread_ids[MAX_NUM_OF_THREADS];


  for(i = 0; i < num; i++)
  {
    pthread_t tid;
    void *thread_data = (void *)(i + 1);
    pthread_create(&tid, NULL, print_function, thread_data);
    thread_ids[i] = tid;
  }

  // You can't join with the thread in the previous loop because it will serialize thread creation.
  // Meaning the program will not create the next thread before the current thread finish execution.
  // Instead, you need to create all the threads first then you join to them one by one afterward.
  // And for that you need to store the thread ids for each thread in order to join with them after they are created.
  for(i = 0; i < num; i++)
  {
    pthread_join(thread_ids[i], NULL);
  }

  return 0;
}