Pthreads 将数据传递到pthread_create()时出现混乱。。。它是如何工作的?

Pthreads 将数据传递到pthread_create()时出现混乱。。。它是如何工作的?,pthreads,Pthreads,请查看我们的pthread_create原型: int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 最后一个参数是一个空指针。但看看互联网上的一些代码,我看到开发人员在做: long t; pthread_create( &thread, NULL, function

请查看我们的pthread_create原型:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);
最后一个参数是一个空指针。但看看互联网上的一些代码,我看到开发人员在做:

long t;
pthread_create( &thread, NULL, function, (void*)t);
而且很有效!!!我的意思是,他们没有:

pthread_create( &thread, NULL, function, (void*)&t);
换言之,未使用t的参考

但是,如果我将数据类型改为int而不是long。。不起作用

我认为应该始终考虑推荐人,但是你知道为什么long在没有推荐人的情况下工作吗


谢谢你们

传递给线程函数的参数是void*。在一般情况下,该指针可以指向函数可以使用的某个数据块

但是,请记住指针本身是一个值。如果要传递的数据量足够小,足以容纳一个空*,也就是说,如果需要传递给函数的只是一个整数值,则通常只使用该值作为线程函数的数据。情况就是这样:

long t;

t = /* some value to pass to the thread */;

pthread_create( &thread, NULL, function, (void*)t);

这样做的一个好处是,您不需要处理线程数据的生命周期问题。

但是,为什么同样的事情在int中不起作用呢?如果long足够小,可以放入void*,int不也应该是这样吗?@shreaderroy-我们必须看具体的代码来说明区别是什么-我怀疑这与符号扩展有关,因为从void*到/从void*的具体方式是编码的。我最初的想法是,当我阅读这个问题时,long的值可能隐含地被识别为地址,但int的值不是。但我不确定。此外,我的想法似乎是特定于实现或编译器的,而最初的海报似乎打算将此作为一种普遍现象。确实需要考虑特定于实现的细节,因为void*、int和long的相对大小在不同的实现中是不同的。这可能是int“不起作用”的原因,而long起作用。谢谢大家的回复。。我在不同的论坛上读到了这方面的消息。。他们说要避免使用引用,因为每个线程都在自己的上下文中运行,并且作为引用传递线程可能会使用相同的指针发生冲突。。但是,如果我需要使用结构传递整数,即使使用结构将数据相乘,我仍然可以在这些结构上使用内部指针。。事实上,无论作品与否,我相信这与排列和尺寸有关。。不确定是否在具有不同处理器(如arm、core8等)的嵌入式系统中工作。