Linux Pthread库,线程参数

时间:2012-06-03 15:09:58

标签: c linux pthreads

如果我在Linux下使用Pthread库创建线程,我需要使用函数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或者手动分配内存。

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

2 个答案:

答案 0 :(得分:4)

您所做的事情在现实世界中是绝对安全的:intvoid *之间的转换不是未定义的行为,它是实现定义的,并且所有实现都以自然,理智的方式定义它。它也是将单整数参数传递给新线程的唯一有效方法。其他方法都需要昂贵的同步,要么通过显式锁定,要么在原始线程中使用malloc,在新线程中使用freemalloc / {{隐藏同步成本隐藏1}}实施)。

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

答案 1 :(得分:1)

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