【问题标题】:How to pass multiple values through command line arguments in void function?如何通过 void 函数中的命令行参数传递多个值?
【发布时间】:2017-01-15 22:04:25
【问题描述】:
#define SMALL_STACK 131072 //128K for stack
pthread_attr_t thread_attr; //for attr

void* fn(void* arg)
{ //fn fuction
  printf("%d", (char *) arg);
  return NULL;
}

int main(int argc, char** argv)
{
  printf("Have ");
  printf(" arguments:"); //checking multiple arguments
  for (int i = 0; i < argc; ++i)
  {
    printf("%s", argv[i]);
  }
  printf("\n");
  pthread_attr_init(&thread_attr);
  pthread_attr_setstacksize(&thread_attr, SMALL_STACK);
  pthread_t th; //creating thread and stack

  /* I Need Help (void*)&argv[1] passing this to void *fn function printing the argument coming from command line arguments */

  pthread_create(&th, &thread_attr, fn, (void*) &argv[1]); //creating thread

  return 0;

}

【问题讨论】:

    标签: c pthreads command-line-arguments


    【解决方案1】:

    在我看来,您应该将struct 实例传递给您的线程参数。

    下面是一个例子:

    struct MyThreadData
    {
        int argc,
        char** argv;
    }
    
    void* fn(void* arg)
    {
        MyThreadData* data=(MyThreadData*)arg;
        /*code*/
        return NULL;
    }
    
    int main(int argc, char** argv)
    {
        /*...*/
        MyThreadData td={0};
        td.argc=argc;
        td.argv=argv;
    
        void* ret = NULL;
        pthread_create(&th, &thread_attr, fn, (void*)&td);
        pthread_join(th,&ret)
    }
    

    【讨论】:

    • 在 C 中不需要强制转换((void*)(MyThreadData*))。
    • 完全同意,我明确地让这些演员表强制理解概念。
    • 哪个概念?这里唯一的概念是,在 C 中,void-pointer 隐式转换为任何其他指针。
    【解决方案2】:

    传递一个参数(这里:第一个)更改

    pthread_create(&th, &thread_attr, fn, (void*)&argv[1]); 
    

    成为

    pthread_create(&th, &thread_attr, fn, argv[1]);
    

    要在线程函数内部打印字符串,请使用正确的转换说明符:

    printf("%s", (char *)arg);
    

    或以“更清洁”的方式进行

    void* fn(void* arg)
    {
      char * pc = arg;
      printf("%s\n", pc); /* add a new-line to flush stdout, to 
                             have this printed immediately. */
    

    传递所有参数然后改变

    pthread_create(&th, &thread_attr, fn, (void*)&argv[1]); 
    

    成为

    pthread_create(&th, &thread_attr, fn, argv);
    

    并调整线程功能如下:

    void* fn(void* arg)
    {
      char ** ppc = arg;
    
      while (*ppc)
      {
        printf("%s\n", *ppc);
        ++ppc;
      }
    
      ...
    

    还要确保main() 不返回标准方式,因为这会结束进程,进而结束进程的所有线程。

    为此替换

    return 0;
    

    通过

    pthread_exit(NULL);
    

    【讨论】:

      猜你喜欢
      • 2012-04-07
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 2017-09-11
      • 1970-01-01
      • 2014-10-17
      相关资源
      最近更新 更多