线程函数中的局部变量是否根据线程有separe副本?

Jee*_*tel 11 c linux multithreading

我在一个函数中声明了一些局部变量,如下所示:

void* thread_function (void* parameter)
{
   struct parameter * thread_data = (struct parameter *)parameter;
   char buffer[20];
   int temp;
}
Run Code Online (Sandbox Code Playgroud)

如果我在一个线程中创建了两个线程,如果缓冲区和临时更新,那么它会影响其他线程吗?

我的意思是如果有两个线程那么会有两个副本的所有局部变量?

编辑:然后在这种情况下,我需要使用线程特定的数据.我的意思是pthread_setspecific和所有这些东西

Arn*_*anc 12

这些变量在堆栈上分配,每个线程都有自己的堆栈:这些变量对每个线程都是私有的(它们不是共享的).(有关详细信息,请参阅此答案.)

例如,如果将thread_data分配给全局指针,则其他线程将能够通过全局指针访问thread_data.

线程特定数据(例如pthread_setspecific)用于创建全局变量,但仍然特定于每个线程(未共享):它们是特定于线程的全局变量.

当您需要全局变量时,需要使用特定于线程的变量,但不希望在线程之间共享它们.


R..*_*R.. 7

并不是每个线程都有自己的副本,而是函数调用的每个实例都有自己的所有自动(即本地非静态)变量的副本,无论实例是在同一个线程还是在不同的线程中.如果实例由于在不同线程中的调用,递归调用,相互/间接递归或甚至从异步信号处理程序的调用而存在,则这是真的.请注意,虽然C标准没有指定线程,但标准中的相关部分可能是5.2.3信号和中断:

应该实现函数,使得它们可以在任何时间被信号中断,或者可以由信号处理程序或两者调用,而不改变先前但仍然有效的调用控制流(在中断之后),函数返回值或具有自动存储持续时间的对象.所有这些对象都应在每次调用的基础上保留在函数图像(构成函数的可执行表示的指令)之外.

这使得每个调用必须具有自己的自动变量存储.