C 为什么threadID是唯一的?
我在C中使用过几次POSIX线程,直到前几天我才考虑过这一点:既然所有线程在启动和运行相同的代码时调用相同的函数来初始化相同的变量(很可能是线程ID),那么为什么将C 为什么threadID是唯一的?,c,pthreads,C,Pthreads,我在C中使用过几次POSIX线程,直到前几天我才考虑过这一点:既然所有线程在启动和运行相同的代码时调用相同的函数来初始化相同的变量(很可能是线程ID),那么为什么将arg中的变量指定给pthread_create()private?例如,代码: #include <stdio.h> #include <pthread.h> void* threadMethod(void* arg) { int threadID = (int) arg; printf("
arg
中的变量指定给pthread_create()
private?例如,代码:
#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);
}
#包括
#包括
void*threadMethod(void*arg)
{
int threadID=(int)arg;
printf(“线程%d在\n中报告”,线程ID);
}
int main()
{
pthread_t线程[8];
对于(int i=0;i<8;i++)
pthread_创建(&threads[i],NULL,threadMethod,(void*)i);
对于(int i=0;i<8;i++)
pthread_join(线程[i],NULL);
}
threadID
对每个线程都有一个唯一的值,但我不明白为什么,因为所有线程执行的方法都是相同的变量。线程不应该覆盖彼此的值吗?我认为这与堆栈有关。有人能澄清一下这里到底发生了什么吗?pthread\u create是一个C函数,因此没有私有的概念。线程函数的参数是“void*”的原因是void*是一个通用指针,可以指向任何类型的内存。内存在线程函数和创建线程的函数之间。您可以自由地将其用于threadId,但它实际上可以是任何东西。因为每个线程可以使用不同的启动函数和不同的数据创建
警告的原因是,在64位计算机上,void*是64位的,而in通常是32位的。编译器警告您可能会丢失强制转换中的数据。使用size\u t
而不是int
应该可以删除警告。问题应该是,“为什么所有8个线程都有自己的参数”(private的意思是其他东西)
答案是,您正在通过值进行传递。
变量的内容被复制到寄存器中
(或堆栈,取决于调用约定)
然后进一步复制到局部参数变量中
(arg),witch位于线程本地内存中。从int到void*再到int的转换是非正统的,但如果指针不小于int,则应该可以工作。“private”是什么意思?它与所有线程使用的方法相同,因此,如果一个线程更改变量
threadID
的值,难道所有线程都不应该看到此更改吗?每次执行threadMethod()
时,您都通过值传递(但转换为指针),运行该函数的每个实例都将获得其各自的threadID
版本。你认为“所有线程读取和写入同一函数中的同一变量”是有缺陷的。在C中,所有函数都是这样工作的。在没有线程的情况下,一个函数可以调用自己,并且实际上可以同时执行多次,在这种情况下,您也将得到多个版本的局部变量,尽可能多的函数实例在执行。@Doddy它不是所有函数中的同一个变量。首先,每个线程都有自己的堆栈,因此线程函数中的所有局部变量对于每个线程都是单独存在的。其次,(void*)i
会将i
复制到线程函数的最后一个参数中-C总是按值传递参数(它的类型是void*
,而不是int
,这在posix平台上是正常的,但在C中通常是不正常的)。请注意,这与传递指向i
的指针(如(void*)&i