【问题标题】:Is pthread_mutex_lock required for thread functions which have local variables?具有局部变量的线程函数是否需要 pthread_mutex_lock?
【发布时间】:2013-11-28 10:02:00
【问题描述】:

这是一个普遍的事实,pthread_mutex_lock( ) 应该始终应用于线程函数中使用的全局和静态变量。线程函数内部的局部变量呢?

在哪些用例中,线程函数内的局部变量应该被锁定还是应该始终被锁定?

例子:

int func( void )
{
  int var;
  var++; // What are the usecases in which this should be locked?

}

pthread_create(&threadid1, NULL, func, NULL);
pthread_create(&threadid2, NULL, func, NULL);

【问题讨论】:

  • 据我所知,您可以在栅栏、互斥锁和/或原子上构建多线程应用程序,因此您的“普遍事实”更像是一种意见。
  • 您应该对在多个线程中使用的变量使用互斥锁。如果您从两个线程(以某种方式)访问局部变量 - 使用 mutex_lock()。否则没有。
  • 应该可以从多个线程访问更正确的线程原语。如何实现这一点取决于您。全局和静态范围只是可以实现的两种方式。相反,锁定只能在另一个线程可以访问锁定主题的情况下才有用。然而,在我看来,虽然可以在不使用全局/静态范围的情况下共享变量,但由于最小意外原则,这是不可取的。
  • 在回答您的 OP 时,通常您不需要这样做。但是,如果在函数中的任何一点,您将函数范围之外的变量控制(通过 ref)传递给另一个线程,那么您可能需要锁定。但是,您的代码不会有效地传达变量的范围。换句话说,通常不会。你可以创建你做的案例,但这会让你成为一个可怕的人。

标签: linux pthreads


【解决方案1】:

不,可以从您的线程安全地访问堆栈变量,即使您使用相同的函数来启动多个线程。

每个线程都有自己的堆栈,因此每次启动它都会有一个单独的 'int var' 实例。

当然,通常的限制确实适用。如果您以某种方式在多个线程之间共享“var”,您仍然需要保护它,但堆栈变量没有隐式或自动共享。

【讨论】:

  • 如何在 func() 中调用 pthread_create 并将 var 作为线程数据传递?
  • 所以,以上述情况为例,我们不能制定一个不应该保护局部变量的通用规则,是的,我想你已经指出了 - if you somehow share 'var' accross multiple threads you still need to protect it
猜你喜欢
  • 1970-01-01
  • 2011-10-30
  • 2011-11-15
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 2013-09-02
  • 2016-01-20
相关资源
最近更新 更多