【发布时间】:2019-05-21 20:45:08
【问题描述】:
我想确定是否可以同时从多个线程调用 C 中的某些函数,以便了解是否需要使用互斥锁来保护它。实现和定义函数的文件没有任何互斥机制,因此有可能只有一个线程访问该函数,但有可能多个线程访问。
我想添加一个线程本地存储变量,我在启动函数时递增,在退出函数时递减。如果递减后变量的值大于0,则多线程访问该函数。
这是我的代码:
#include <stdio.h>
static __thread int threadCounter = 0;
void f(void)
{
threadCounter++;
// do something
threadCounter--;
printf("threadCounter: %d\n", threadCounter);
}
我想知道这个解决方案是否足以确定多个线程是否访问一个函数以及是否有更好的方法来实现这一点。
【问题讨论】:
-
貌似线程局部变量不能成功检测到你想要的东西。根据定义,它与单个线程隔离。
-
您似乎需要与 TLS 变量相反 - 多个线程应该可以访问的一些易失性变量。 TLS 变量仅对其所在存储的线程可见,即每个线程将“看到”其自己的此类变量版本。
-
@EricPostpischil 我想知道线程是否可以同时访问该函数。
-
线程访问“代码区域”从来没有问题,因为代码是只读的。只有当代码使用非自动存储变量时才会有问题。如果一个函数调用其他函数,那么实现互斥锁应该在将使用共享数据(变量或资源)的最低级别。我认为这是一个适当的设计问题。
-
如果多个线程调用该函数(根本没有),并且没有互斥锁,并且 f 操作的东西不是多线程安全的,那么你应该放入互斥锁,除非你可以证明调用不会同时发生的代码的其他方面(例如,
f仅在线程完成了排除多个线程的其他操作后才被调用)。有一些技术可以揭示f在实验运行中是否被同时调用,但f可能在实验运行中从未被同时调用,但在实践中最终会被同时调用。
标签: c multithreading