简单的C ++程序来打印pthread ID

时间:2018-09-24 22:12:23

标签: c++ parallel-processing pthreads

因此,我一直在尝试使其运行,但无法弄清楚出了什么问题。我唯一的意图是创建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;
}

2 个答案:

答案 0 :(得分:1)

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

在您的main中是错误的(并且return retprinter中是错误的),因为i是整数,但是argv[1]的类型是{ {1}}也是一个指针。也许您是说(在您的char*中):

main

请记住要编译所有警告和调试信息:对于C ++代码, int n = atoi(argv[1]); for (int i=1; i<n; i++) 使用GCC,对于C代码则使用g++ -Wall -Wextra -g。在C ++中,您可以使用<thread>。改进您的代码,根本不发出任何警告。阅读How To Debug Small Programs。了解如何use the gdb debugger

请注意,gcc -Wall -Wextra -Wmissing-prototypes -g在您的return -1内部是不良品味(至少在Linux上,请参见execve(2),并了解main与{{1}之间的关系})。您应该返回EXIT_FAILURE(或对此使用exit)。

顺便说一句,main通常是一些整数类型,但是POSIX标准没有指定哪一个。如果要打印一个,实际上最好将它显式强制转换为足够宽的整数类型,例如execve和代码pthread_t,这样将不会给您任何帮助警告。

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

当然,您不要让其他线程运行足够的时间。在从long long返回之前,您可以在主线程中SICP一点,您确实应该像sleep那样等待线程。

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

答案 1 :(得分:1)

您的问题是,如果“主”线程退出,则所有子线程将被杀死。

因此,必须使“主”线程等待,直到所有子级都完成。

     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*[]。即它是一个char指针数组。虽然我是一个整数。现在它可以编译,因为整数很容易转换为指针(但可能会生成警告)。

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