【发布时间】: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)传递给另一个线程,那么您可能需要锁定。但是,您的代码不会有效地传达变量的范围。换句话说,通常不会。你可以创建你做的案例,但这会让你成为一个可怕的人。