Linux中的pthread概念
Posted
技术标签:
【中文标题】Linux中的pthread概念【英文标题】:pthread concepts in linux 【发布时间】:2011-06-21 03:40:48 【问题描述】:我对 linux 中的 pthreads 有一些疑问:
-
是不是
pthread_t
是类似于int
和char
的数据类型表明我们在定义一个线程?
如果是这样,它需要多大的尺寸? 2字节还是4字节?
编译器是在该语句之后立即将内存分配给pthread_t thread1
,还是等到它调用pthread_create()
?
如何设置线程属性,它们的典型用途是什么?
在pthread_create()
调用中只能传递多个参数吗?如果有,怎么做?
我有很多这样的事情。也请随意推荐任何好的网站或文件来阅读。
【问题讨论】:
【参考方案1】:逐一回答问题,但不一定按照相同的顺序:
pthread_t
是不是类似于int
或char
的数据类型,说明我们在定义一个线程?编译器是在这句话之后立即为pthread_t thread1
分配内存还是等到找到pthread_create()
调用
pthread_t
是一种类似于int
的类型,它是在您定义它时创建的,而不是在您调用pthread_create
时创建的。在sn-p中:
pthread_t tid;
int x = pthread_create (&tid, blah, blah, blah);
它是创建变量的 first 行,尽管它在从 pthread_create
返回之前没有任何用处。
pthread_t
占用多少大小,2 字节还是 4 字节?
您不应该关心它占用了多少空间,就像您应该关心FILE
结构占用了多少空间一样。您应该按预期使用结构。如果你真的想知道,那么sizeof
就是你的朋友。
有关如何设置线程属性的任何有用信息?
如果你想使用默认属性以外的任何东西,你必须先创建一个属性变量,然后将它传递给pthread_create
调用。
我们可以只将pthread_create
函数中的一个参数传递给函数吗?我们不能在pthread_create()
函数中向被调用线程发送2或3个参数吗?
虽然您只能向线程传递 一个 额外参数,但没有什么能阻止您将这个参数设置为指向包含一百种不同事物的结构的指针。
如果您正在寻找有关如何使用 pthread 的信息,可以在 Google 搜索的末尾找到很多东西,但我自己仍然更喜欢死树版本:
【讨论】:
【参考方案2】:需要多大的尺寸
pthread_t
使用 sizeof pthread_t
字节。
并且我们只能在 pthread_create 中将一个参数传递给函数不超过一个?我们不能在 pthread_create() 函数中向被调用线程发送 2 或 3 个参数吗?
你只需要一个论据。你得到的只是一个论据。这是一个void *
,因此您可以传递一个指向任何您想要的东西的指针。例如包含多个值的结构。
我有很多这样的事情,建议阅读任何好的网站或文档
查看 pthread
手册页、online 或您选择的 shell(man pthread
、man pthread_create
等)。我开始阅读一些basic lecture slides(这里是the sequel)。
【讨论】:
【参考方案3】: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.
【讨论】:
【参考方案4】:查看pthread.h
文件以获取更多信息。在我的系统上,pthread_t
被定义为unsigned long int
。但我想这取决于平台,因为它被定义为bits/pthreadtype.h
。
【讨论】:
这非常依赖于平台。在某些系统上,它是struct
。以上是关于Linux中的pthread概念的主要内容,如果未能解决你的问题,请参考以下文章
(转载)Linux 线程取消(Pthread_cancel)
windows 下有没有类似linux中的pthread_detach,pthread_join和pthread_joinable函数