【问题标题】:Linux Pthread library, thread argumentsLinux Pthread 库,线程参数
【发布时间】:2012-06-03 15:09:57
【问题描述】:

如果我在 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;
}

我想做这样的事情,所以我可以将变量的值保留在堆栈上,这样我就可以从我的线程例程中访问它,但我不想为单个变量创建结构或手动分配内存。

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

【问题讨论】:

    标签: c linux pthreads


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-06-08
        • 1970-01-01
        • 1970-01-01
        • 2011-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多