【问题标题】:HOw should I print the pthread ID in C++?我应该如何在 C++ 中打印 pthread ID?
【发布时间】:2018-09-24 22:12:23
【问题描述】:

所以我一直试图让它运行,但不知道出了什么问题。我唯一的目的是创建 pthread 并在控制台上输出它们的 ID。刚开始使用c ++,所以我不确定我哪里出错了。你能看看这个,也许能帮帮我吗?谢谢

void *printer(void* temp)
{
    pthread_t self_id; 
    int ret;
    self_id=pthread_self();
    printf("\nThis is pthread %u\n",self_id);
    return NULL;
}

int main (int argc, char* argv[])
{
    pthread_t create;
           int ret;
           ret = pthread_create(&create, NULL, &printer, NULL);
}

    return 0;
}

【问题讨论】:

  • pthread_create 的第三个参数是新线程启动时调用的函数的地址。 $printer 是什么?
  • @bruceg 我必须创建一个像 void *printer(void *printer) 这样的新函数吗?
  • @DJKHAAAED 是的。
  • @Swordfish 我应该传入什么参数才能打印出 ID?
  • @DJKHAAAED 您不必传递任何参数。在您的printer() 中调用pthread_self() 以获取其线程ID。

标签: c++ parallel-processing pthreads


【解决方案1】:
    for (int i = 1; i < argv[1]; ++i)

在你的main 中是错误的(return retprinter 中是错误的),因为i 是一个整数,但argv[1]char* 类型,所以是一个指针。也许你的意思是(在你的main):

   int n = atoi(argv[1]);
   for (int i=1; i<n; i++)

记住编译时包含所有警告和调试信息:g++ -Wall -Wextra -gGCC 用于 C++ 代码,或 gcc -Wall -Wextra -Wmissing-prototypes -g 用于 C 代码。在 C++ 中,您可以使用 &lt;thread&gt;。改进您的代码以完全不收到警告。阅读How To Debug Small Programs。了解如何use the gdb debugger

请注意 return -1 在您的 main 中的品味很差(至少在 Linux 上,请参阅 execve(2) 并阅读您的 main 和 shell 中的 execve 之间的关系)。你应该返回EXIT_FAILURE(或者使用exit)。

顺便说一句,pthread_t 通常是某种整数类型,但 POSIX 标准没有指定哪一种。如果您想打印一个,实际上您最好将其显式转换为足够宽的整数类型,例如long long 和代码printf("This is pthread %lld\n",(long long) self_id);,这不会给您任何警告。 p>

最后,我建议先学习一门编程语言(C 比 C++ 简单得多,您必须在两者之间进行选择)并将其用于顺序编程,稍后学习pthreads。并行线程编程是一个高级主题。从多线程编程开始,你的门槛真的太高了。在尝试 pthread 之前,学习基本的顺序编程。另请参阅 http://norvig.com/21-days.html 以获得有用的见解。 顺便说一句,如果您从未编程过,SICP 是一个很好的介绍(它不使用 C 或 C++ 或线程)。

当然,您不会让其他线程运行足够的时间。在从main 返回之前,您可以在主线程中稍微sleep,并且您真的应该等待您的线程,如explained by Martin York

但我认为你需要在尝试多线程之前学习顺序编程。

【讨论】:

  • 再次感谢。我想我应该指出我的输入将类似于 ./pthreads 10 ,其中这个 '10' 是告诉我的程序需要创建多少线程的值。
  • 这不是你的输入,而是运行你程序的命令
  • 我现在在编译时收到的唯一警告是warning: too many arguments for format [-Wformat-extra-args] printf("\n This is pthread ", self_id);
  • 这是一个很好的警告,您应该继续努力。当然,请阅读printf(3) 的文档。由于缓冲,最好以\n结束printf控制字符串
  • 谢谢!我将继续阅读这些主题。感谢您的帮助
【解决方案2】:

你的问题是如果“主”线程退出,所有子线程都会被杀死。

所以你必须让“主”线程等到所有子线程都完成。

     pthread_t create;
     int ret = pthread_create(&create, NULL, &printer, NULL);
     if (ret == 0) {
         pthread_join(create, nullptr);  // wait for thread to finish.
     }

我要补充一点:

      i < argv[1]

不做你认为它做的事。注意 argv 的类型是char*[]。即它是一个字符指针数组。而 i 是一个整数。现在它编译为整数很容易转换为指针(但可能会产生警告)。

您需要将argv[1] 中的字符串转换为整数,然后再与i 进行比较。

【讨论】:

  • 非常感谢。我继续将 argv 替换为测试用例的整数。现在我将改变主要的
猜你喜欢
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
相关资源
最近更新 更多