11

鉴于以下情况:

pthread_t thread;
pthread_create(&thread, NULL, function, NULL);
  • 到底pthread_create做什么thread

  • thread加入主线程并终止后会发生什么?

  • 如果在thread加入后,你这样做会发生什么:

    pthread_create(&thread, NULL, another_function, NULL);
    
4

2 回答 2

5

pthread_create 到底对线程做了什么?

thread是一个对象,它可以保存一个值来标识一个线程。如果pthread_create成功,它会填写一个标识新创建线程的值。如果失败,则thread调用后的值未定义。(参考: http: //pubs.opengroup.org/onlinepubs/009695399/functions/pthread_create.html

线程加入主线程并终止后会发生什么?

对象什么也没有发生,但它持有的值不再引用任何线程(例如,您不能再将它传递给采用 a 的函数,pthread_t如果您不小心这样做了,那么您可能会ESRCH返回错误)。

如果在线程加入后执行以下操作会发生什么:

和以前一样:如果pthread_create成功,则分配一个值来标识新创建的线程。

于 2012-05-03T16:19:23.020 回答
2

pthread_create 将使用操作系统调用创建一个线程。抽象的美妙之处在于你不需要关心下面发生的事情。它将变量 thread 设置为可用于引用该线程的标识符。例如,如果您有多个线程并想取消其中一个,只需调用

pthread_cancel(线程)

使用正确的 pthread_t 标识符来指定您感兴趣的线程。

线程加入主线程并终止后会发生什么?

在线程终止之前,var 线程用作获取或标识线程的键/索引。线程终止后,键/索引指向的值不再有效。您可以保留它并尝试重用它,但这几乎肯定会导致错误。

如果在线程加入后执行以下操作会发生什么:

pthread_create(&thread, NULL, another_function, NULL);

没问题,因为你给它一个对 thread 的引用,所以 thread 的值将被设置为刚刚创建的新线程的标识符。我怀疑它可能和以前一样,但我不会指望它。

于 2012-05-03T16:11:18.643 回答