【问题标题】:Does local variable in thread function have separe copy according to thread?线程函数中的局部变量是否根据线程有单独的副本?
【发布时间】:2011-11-15 07:14:30
【问题描述】:

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

void* thread_function (void* parameter)
{
   struct parameter * thread_data = (struct parameter *)parameter;
   char buffer[20];
   int temp;
}

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

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

编辑:那么在这种情况下我需要使用线程特定的数据。?我的意思是 pthread_setspecific 和所有这些东西

【问题讨论】:

  • 使用pthread_setspecific 和 Co,您可以获得可以由同一线程中的所有函数全局访问的存储空间,而无需将其作为参数传递给这些函数。

标签: c linux multithreading


【解决方案1】:

这些变量分配在栈上,每个线程都有自己的栈:这些变量是每个线程私有的(它们不是共享的)。 (详情请参阅this answer。)

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

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

当您需要全局变量但又不想在线程之间共享它们时,您需要使用线程特定的变量。

【讨论】:

  • 那么在这种情况下我需要使用线程特定的数据。?我的意思是 pthread_setspecific 和所有这些东西
  • 你需要这个来创建特定于每个线程的全局变量
【解决方案2】:

局部变量存储在堆栈内存中,是线程私有的。

因此它们不在线程之间共享:每个线程中的每个变量都会有一个独立的副本

更新 您是否想在线程之间共享数据实际上归结为一个设计问题。你的线程在做什么?他们的工作是协调一致的,还是只是处理队列的工作人员。

要考虑的主要问题是共享数据的同步。线程之间共享的变量是可以意外更改值的变量(在单个线程内),因此需要这样处理。我建议你宁愿分享,除非你有特定的理由这样做。

【讨论】:

  • 那么在这种情况下我需要使用线程特定的数据。?我的意思是 pthread_setspecific 和所有这些东西
  • 那么,您的问题是:如何在线程之间共享数据?如果是这样,那是一个非常不同的问题,您应该更新主要问题,或者提出一个新问题。
  • 不,我知道如何在线程之间共享数据,但我想问什么时候需要共享,什么时候不需要。?
【解决方案3】:

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

函数的实现应使得它们可以在任何时候被信号中断,或者可以被信号处理程序调用,或两者兼而有之,而不改变较早但仍处于活动状态的调用的控制流(在中断之后)、函数返回值或具有自动存储持续时间的对象。所有此类对象都应在每次调用的基础上维护在函数映像(构成函数的可执行表示的指令)之外。

这清楚地表明每个调用必须有自己的自动变量存储。

【讨论】:

  • 抱歉,您在黄色方框中的回答太混乱了。我试着读了 5-6 遍,但还是看不懂。
  • @SurajS:这是引用标准的文字,不是我的文字。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 2014-03-03
相关资源
最近更新 更多