我在C中使用了几次POSIX线程,直到前几天我才想到这个:为什么变量从arg
赋予pthread_create()
私有,因为所有线程在启动时调用相同的函数并运行相同的代码来初始化相同的变量(很可能是线程ID)?例如,代码:
#include <stdio.h>
#include <pthread.h>
void* threadMethod(void* arg)
{
int threadID = (int) arg;
printf("Thread %d reporting in\n", threadID);
}
int main()
{
pthread_t threads[8];
for (int i = 0; i < 8; i++)
pthread_create(&threads[i], NULL, threadMethod, (void*) i);
for (int i = 0; i < 8; i++)
pthread_join(threads[i], NULL);
}
threadID
对每个线程都有唯一的值,但我不明白为什么,因为它是所有线程执行的相同方法中的相同变量。不应该线程覆盖彼此的线索#39;它的价值?我认为它与堆栈有关。有人可以澄清一下究竟发生了什么吗?
答案 0 :(得分:1)
问题应该是,&#34;为什么所有8个主题都得到自己的论点&#34;
(私人意味着别的东西)
答案是,你正在路过价值
变量的内容被复制到寄存器
中
(或根据调用惯例的堆栈)
然后进一步复制到本地参数变量
中
(arg),女巫生活在线程本地记忆中。
答案 1 :(得分:0)
pthread_create是一个C函数,所以没有私有的概念。你的线程函数的参数是“void *”的原因是因为void *是一个可以指向任何类型内存的泛型指针。内存是什么,是在线程函数和创建线程的函数之间。你可以自由地使用它作为threadId,但它确实可以是任何东西。由于可以使用不同的启动函数和使用不同的数据创建每个线程。
警告的原因是64位机器上的void *是64位,但通常是32位。编译器警告您可能会丢失演员表中的数据。使用size_t
代替int
会删除警告。