gpt4 book ai didi

将 long 转换为 (void *) 以传递

转载 作者:行者123 更新时间:2023-12-03 03:41:20 29 4
gpt4 key购买 nike

通读 pthread tutorial从 LLNL 我输入了以下示例代码

/******************************************************************************
* FILE: hello.c
* DESCRIPTION:
* A "hello world" Pthreads program. Demonstrates thread creation and
* termination.
* AUTHOR: Blaise Barney
* LAST REVISED: 08/09/11
******************************************************************************/
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 5

void *PrintHello(void *threadid)
{
long tid;
tid = (long)threadid;
printf("Hello World! It's me, thread #%ld!\n", tid);
pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
for(t=0;t<NUM_THREADS;t++){
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}

/* Last thing that main() should do */
pthread_exit(NULL);
}

我可以明白为什么通过void *来转换long(就好像它不是,并且您将一个指针传递给t 线程打印出来的数字是乱码),我的问题是这应该被认为是合理的并且总是有效吗?或者这是获得线程工作的最简单示例的快速技巧?这是标准的C语言吗?

最佳答案

不,就 ISO C 标准而言,这不是严格意义上的 kosher,因为不能保证指针足够宽以容纳 long。

一个彻底的解决方案是将一个指针传递给long,或者每个线程有一个唯一的long(例如数组中的一个)或具有线程间通信(例如条件变量)在创建者线程和创建的线程之间,以便后者可以在前者被允许更改它以进行下一个线程创建之前进行复制。

然而,它不严格的事实并不意味着它在特定的实现中不起作用。如果您可以保证 void*long 之间的转换不会丢失任何信息,它可能会正常工作。

来自 C11 6.3.2.3 指针(尽管与 C99 相比基本没有变化):

An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.

Any pointer type may be converted to an integer type. Except as previously specified, the result is implementation-defined. If the result cannot be represented in the integer type, the behavior is undefined. The result need not be in the range of values of any integer type.

关于将 long 转换为 (void *) 以传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12274902/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com