【问题标题】:typecasting in threads code线程代码中的类型转换
【发布时间】:2013-05-09 03:19:46
【问题描述】:

https://computing.llnl.gov/tutorials/pthreads/samples/join.c

我正在查看上面链接中的 pthreads 代码。

我无法理解上面代码中对变量 t 和 BusyWork 和主要方法中的状态进行的类型转换。

来自 pthread_exit 的手册页:

retval 指向的值不应位于调用线程的堆栈中,因为该堆栈的内容在线程终止后未定义。

所以我猜这个例子中的类型转换是试图避免在刚刚终止的线程堆栈上引用内存。但我发现这种类型转换非常不方便和奇怪。谁能解释一下?

【问题讨论】:

  • 我认为类型转换与t 变量的存储没有任何关系。这也是多余的,因为t 已经是void * 类型...
  • 我同意 H2C03。强制转换是多余的,但我认为您可能会混淆位于调用线程堆栈“上”的值与 passed-by-value 参数 in 堆栈. IE。必须避免返回&t(或任何其他堆栈变量地址),因为结果void * 在proc 的调用框架之外是未定义的。 t 本身就是一个值,仅此而已,在这种情况下,传入的是同一个值。至少我相信这可能是您断开连接的地方。

标签: c pthreads


【解决方案1】:

当您使用 pthread_create 创建线程时,您的参数仅限于 sizeof(void *),您通常使用它来传递指向结构的指针或任何其他可能大于参数大小的数据。

在此示例中,参数 long t 的大小小于 sizeof(void *),因此您可以简单地将参数直接传递给 pthread_create() 调用。

显式转换是为了确保如果分配给类型 (long) 或类型 (void *) 的内存有任何差异,编译器会修复它。

实际上,这些转换在大多数平台上都不会做任何事情,但您不能保证这一点,因此您必须在使用之前将参数显式转换为正确的类型。

继续:示例使用类型 void * 作为类型 long,而不是作为文字指针,因此变量 status 不会取消引用任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多