成员函数线程安全吗?

时间:2015-07-15 00:00:05

标签: c++ multithreading stdthread

我在Server对象中有多个线程正在执行相同的任务。这些线程是init,带有Server :: *例程。

在这个例程中,有一些无限循环和一些治疗。

我想知道在多线程中使用相同的方法是否是线程安全的?难怪这个类的领域,如果我想读或写它我将使用互斥量。但是例程本身呢?

由于函数是一个地址,那些线程将在同一个内存区运行吗?

我是否需要为每个线程创建一个具有相同代码的方法?

Ps:我使用std :: mutex(& Server :: Task,this)

3 个答案:

答案 0 :(得分:3)

在C ++中,每个线程都分配了自己的调用堆栈。这意味着仅存在于给定线程的调用堆栈范围内的所有局部变量都属于该线程。但是,在共享数据或资源(例如全局数据结构或数据库)的情况下,不同的线程可以同时访问这些数据或资源。此同步问题的一个解决方案是使用您正在执行的std::mutex

答案 1 :(得分:3)

两个线程同时运行相同的函数没有问题(无论它是否是成员函数)。

就说明而言,它类似于你有两个线程同时读同一个字段 - 没关系,它们都得到相同的值。 (当你有一个写作和一个阅读,或两个写作,你可以开始有竞争条件)

答案 2 :(得分:0)

虽然函数本身在内存中可能与它在表中的位置相同,但是你不是从多个位置写入它,函数本身是不可变的,并且该函数内的局部变量将被堆叠每个帖子。

如果您的写入受到保护且提取不会过时,那么您在大多数架构和实施中都可能需要安全。