参数'opt'通过pthread_create传递给我的函数:
intptr_t num1 = 0;
pthread_create(&t1, NULL, &routine, &num1)
然后在我的函数中有一个switch语句,它将根据情况打印两个语句中的一个:
void* routine(void* opt) {
long int n = (long int)&opt;
switch(n) {
case 0:
printf("Test 0 from threadsn");
break;
case 1:
printf("Test 1 from threadsn");
break;
};
sleep(3);
printf("Ending thread...n");
return NULL;
}
函数的第一行是我卡住的地方。我正试图将num1的原始值转换为'n',以便我可以将其用于switch语句。
为了解决这个问题,您可以更改
long int n = (long int)&opt;
:
long int n = *(intptr_t*)opt;
然而,这似乎不是一个合适的解决方案。下面的代码看起来不太理想:
intptr_t num1 = 0;
pthread_create(&t1, NULL, &routine, &num1)
在这种情况下,如果您只希望它存储值0
或1
,则似乎不适合使用类型intptr_t
(其设计用于将指针值保存为整数)。
您当然可以简单地使用int
或long int
来代替数据类型intptr_t
。但是我怀疑您选择的数据类型intptr_t
是为了能够直接将值存储在指针中,如下所示:
intptr_t num1 = 0;
pthread_create(&t1, NULL, &routine, (void*)num1 );
如果您这样做,那么,在函数routine
中,您可以使用
long int n = (intptr_t)opt;
将指针转换回数字。
第一个解决方案的缺点是,无论何时解引用指针,都必须确保被引用对象的生命周期没有过期。对于第二个解决方案,这不是问题。
您传入的原始值是intptr_t *
,因此您应该将其读取为。
intptr_t *n = opt;
switch(*n) {
routine
根本没有以要求通过引用传递整数的方式使用参数。也就是说,你只使用整数的值。由于您已经使用了intptr_t
,因此您可以利用inptr_t
s可以安全地转换为指针并返回的事实。
pthread_create(&t1, NULL, routine, (void*)num1);
void *routine(void *opt)
{
intptr_t n = (intptr_t)opt;
...
}
这种方法的一个好处是,由于您是按值传递整数,因此如果原始变量超出作用域,您不会遇到问题。