【问题标题】:How to copy pthread_attr_t?如何复制 pthread_attr_t?
【发布时间】:2013-06-06 18:54:21
【问题描述】:

我猜想使用memcpy 复制pthread_attr_t 不是一个好主意,因为该结构在Darwin 和Linux 上似乎都是私有的。复制pthread_attr_t 的正确方法是什么? pthreads 中没有复制功能。对所有属性进行 get/set 可能是最安全的方法,但它不是未来的证明。

这是我的 Ubuntu 机器上的样子,仅供参考:

#define __SIZEOF_PTHREAD_ATTR_T 36

typedef union
{
    char __size[__SIZEOF_PTHREAD_ATTR_T];
    long int __align;
} pthread_attr_t;

【问题讨论】:

  • 另一个来自man pthread_attr_t on Ubuntu 的参考: > pthread_attr_t 类型应被视为不透明:除通过 pthreads 函数之外的任何对 > 对象的访问都是不可移植的并且会产生未定义的结果。但是我也不明白您发布的pthread_attr_t 的定义。我在这里问一个问题。希望以后有人能解释一下。 stackoverflow.com/questions/55676440/…

标签: c pthreads posix


【解决方案1】:

有趣的问题,但答案(从pthread_attr_init() 规范的基本原理部分判断)是您不应该复制pthread_attr_t 对象。你是对的,memcpy() 等不是可靠的机制(无论如何,普通的旧分配有什么问题?)。

【讨论】:

  • 并且sys/types.h 声明没有为 pthread_attr_t 定义赋值操作
  • 感谢您提供一些背景资料。是的,缺少分配,但 pthread_attr_t 可以重复用于创建多线程。我想我可能无需复制 pthread_attr_t 就可以逃脱,但我仍然很好奇是否有正确的方法来做到这一点。
  • 当我需要这样做时,我最终编写了一个函数来从一个 pthread_attr_t 读取属性字段并将它们写入另一个。如果有人去一些较新版本的 pthread lib 中添加/删除字段,那就有点麻烦了。但这似乎是你必须做的。
  • 您想解释一下为什么pthread_attr_t 的定义看起来像这样吗?我在这里问一个问题Confusion about the pthread_attr_t definition
猜你喜欢
  • 2017-08-18
  • 2017-03-13
  • 2019-06-08
  • 2013-01-24
  • 2013-01-06
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多