Linux中的pthread概念

时间:2011-06-21 03:40:48

标签: linux multithreading pthreads

我对linux中的pthreads有一些疑问:

  1. pthread_t是一种类似于intchar的数据类型,表明我们正在定义一个帖子吗?
  2. 如果是这样,需要多大的尺寸? 2个字节还是4个字节?
  3. 编译器是否在该语句之后立即将内存分配给pthread_t thread1,还是等到pthread_create()调用之后?
  4. 如何设置线程属性,以及它们的典型用途是什么?
  5. 只能在pthread_create()来电中传递多个参数吗?如果是这样,怎么样?
  6. 我脑子里有很多这样的事情。也请随时建议任何好的网站或文件阅读。

4 个答案:

答案 0 :(得分:9)

逐个回答问题,但不一定按照相同的顺序:

pthread_t是一种类似于intchar的数据类型,表示我们正在定义一个帖子吗?编译器是在该句子之后立即将内存分配给pthread_t thread1还是等到找到pthread_create()调用

pthread_t是一种类似于int的类型,它是在您定义它时创建的,而不是在您调用pthread_create时创建的。在摘录中:

pthread_t tid;
int x = pthread_create (&tid, blah, blah, blah);

它是创建变量的第一个行,但在从pthread_create返回之前它没有任何用处。

pthread_t占用多少大小,2个字节或4个字节?

你不应该关心它需要多少空间,而不是你应该关心FILE结构占用多少空间。您应该按预期使用该结构。如果真的想知道,那么sizeof就是你的朋友。

有关如何设置线程属性的任何好信息?

如果要使用默认属性以外的任何其他内容,则必须先创建属性变量,然后将其传递给pthread_create调用。

我们只能将pthread_create函数中的一个参数传递给函数吗?我们不能在pthread_create()函数中向被调用的线程发送2或3个参数吗?

虽然你只允许将一个额外参数传递给线程,但没有什么可以阻止你将这个参数作为指向一个容纳一百个不同东西的结构的指针。


如果您正在寻找有关如何使用pthreads的信息,Google搜索结束时会有很多内容,但我仍然更喜欢死树版本:

PThreads programming book, ISBN 13: 978-1-56592-115-3, ISBN 10: 1-56592-115-1

答案 1 :(得分:2)

  

需要多大的尺寸

pthread_t使用sizeof pthread_t字节。

  

我们只能将pthread_create中的一个参数传递给函数不超过一个?我们不能在pthread_create()函数中将2或3个参数发送到被调用的线程?

你需要的只是一个论点。你得到的只是一个论点。它是void *,因此您可以将指针传递给您想要的任何内容。例如包含多个值的结构。

  

我脑子里有很多东西,比如建议阅读好的网站或文件

查看pthread手册页,online或您选择的shell(man pthreadman pthread_create等)。我开始阅读一些basic lecture slides(这里是the sequel)。

答案 2 :(得分:1)

pthread_t可以是任何个字节数。它可以是char,int,指针或结构......但你既不需要知道也不需要关心。如果您需要用于分配目的的大小,请使用sizeof(pthread_t)。您可以将其分配给的唯一变量类型是另一个pthread_t

在定义pthread_t时,编译器可能会也可能不会分配与线程关联的资源。同样,您不需要知道也不需要关心,因为您需要在您创建的任何线程上调用pthread_join(或pthread_detach)。只要遵守规则,系统就会确保它不会泄漏内存(或任何其他资源)。

属性无疑是有点笨拙的。它们保存在pthread_attr_t对象中,该对象也可以表示为整数,指针或整个结构。您必须使用pthread_attr_init对其进行初始化,然后使用pthread_attr_destroy将其销毁。在这两者之间,您使用各种pthread_attr_...调用来设置或清除属性,然后您可以将其作为一个或多个pthread_create调用的一部分传递,以设置新线程的属性。

不同的实现可以并且将以不同的方式处理所有这些事情。

LLNL has a decent set of introductory information

答案 3 :(得分:0)

查看pthread.h文件以获取更多信息。在我的系统上,pthread_t被定义为unsigned long int。但我想这是依赖于平台的,因为它被定义为bits/pthreadtype.h