C Linux Pthread库,线程参数

C Linux Pthread库,线程参数,c,linux,pthreads,C,Linux,Pthreads,如果我在Linux下使用Pthread library创建线程,我需要使用函数Pthread_create,作为它接受void*的参数之一,这样我就可以传递指向某个对象的指针,这样我的线程例程就可以访问它,但这样做安全吗 {//some scope int a=5//scope variable pthread_create(&id,NULL,some_function,(void*)a); }//end of scope 在我的日常生活中: void *some_fu

如果我在Linux下使用Pthread library创建线程,我需要使用函数Pthread_create,作为它接受void*的参数之一,这样我就可以传递指向某个对象的指针,这样我的线程例程就可以访问它,但这样做安全吗

{//some scope
    int a=5//scope variable
    pthread_create(&id,NULL,some_function,(void*)a);
}//end of scope
在我的日常生活中:

void *some_function(void *_arg)
{
    int a=(int)arg;
    return NULL;
}
我想这样做,这样我就可以在堆栈上保留一个变量的值,这样我就可以从线程例程中访问它,但我不想为单个变量创建struct或手动分配内存


我将创建几个这样的线程,所以我想知道在这种情况下我是否可以过得去,并且不使用列表或动态数组。

您所做的在现实世界中是完全安全的:int和void*之间的转换不是未定义的行为,而是实现定义的,所有实现都以自然方式定义它,理智的方式。这也是将单个整数参数传递给新线程的唯一有效方法。其他方法都需要昂贵的同步,要么通过显式锁定,要么在原始线程中使用malloc,在新线程中使用free,后者在malloc/free实现中隐藏了隐式同步成本


但是,您会发现,有些编译器会对转换发出警告。这是因为旧的中断代码假定int可以表示void*的全部值;编译器无法区分将int存储在void*中的有效做法和将void*存储在int中的无效做法。作为解决方案,您可能希望使用intptr\t而不是int,这将避免出现警告。如果您的原始变量是int,只需通过intptr\t添加额外的中间转换即可避免警告。

您所做的在现实世界中是完全安全的:int和void*之间的转换不是未定义的行为,它是实现定义的,所有实现都以自然、理智的方式定义它。这也是将单个整数参数传递给新线程的唯一有效方法。其他方法都需要昂贵的同步,要么通过显式锁定,要么在原始线程中使用malloc,在新线程中使用free,后者在malloc/free实现中隐藏了隐式同步成本


但是,您会发现,有些编译器会对转换发出警告。这是因为旧的中断代码假定int可以表示void*的全部值;编译器无法区分将int存储在void*中的有效做法和将void*存储在int中的无效做法。作为解决方案,您可能希望使用intptr\t而不是int,这将避免出现警告。如果原始变量是int,只需通过intptr\t添加额外的中间转换即可避免警告。

在这种情况下,通过arg参数将a的值推送到某个函数的堆栈上是安全的,因为void*的大小足以支持整数的值。

在这种情况下,通过arg参数将a的值推送到某个函数的堆栈上是安全的,因为void*的大小足以支持整数的值