c - Linux Pthread 库,线程参数

标签 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;
}

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

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

最佳答案

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

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

关于c - Linux Pthread 库,线程参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10871427/

相关文章:

c++ - 如何用 pthread 捕获堆栈溢出?

c - Pthreads:如果只允许在一行代码上使用互斥锁,如何确保线程安全

c - ARM Cortex-M4 : Running code from external flash

c - 如何从字符字符串(位于字符字符串数组中)中删除最后一个字符

c - scanf() 将换行符保留在缓冲区中

linux - 在 Intellij IDEA 13 (Linux) 中打开一个 eclipse 项目

c++ - 如何从安装的文件夹中读取文件c/c++

linux - 我可以在不使用 openstack 或 EC2 的情况下运行 cloud-init 环境吗?

linux - 可以在 Windows 上的 Docker 中运行 ARM/rpi 图像,但不能在 linux 上运行

c - Stage3D 和 pthreads