C++ pthread,两个线程读取一个全局变量

C++ pthread, two threads read a global variable

本文关键字:读取 一个 全局变量 线程 两个 pthread C++      更新时间:2023-10-16

如果有两个线程只读取一个全局变量,是否有必要使用互斥锁来锁定和解锁全局变量?

如果线程只读取变量并且没有人写入它(不是其中一个线程,也不是其他人),那么没有锁就完全没问题了。如果可能发生任何并发修改,那么每个人(包括纯读取器)都必须以某种方式同步 - 通过互斥锁,读/写锁或其他方式。

通常,需要独占访问以防止看到不一致的状态。对于读取器线程,这意味着避免部分读取

那是什么意思?假设您有一个值存储在两个(原子)整数上,例如坐标。

int i = 3;
int j = 4;

现在,我们将在它们进行修改时读取ij,更准确地说,当Writer线程想要以对角线方式从(3, 4)移动到(4, 5)时:

Reader     Writer
  |          |
  |        i = 4
  |          |
i = 4     <pause>
j = 4        |
  |        j = 5
  |          |

这称为部分读取Reader线程已获取对象处于(4, 4)的信息,即使它从未存在过。我会让你想想如果这些坐标被用来计算飞机的轨迹会发生什么......

然而,避免部分读取是相当容易的:突变应该以原子方式看待。

  • 如果没有突变(在读取期间),那么您可以只读取
  • 如果存在突变,则需要互斥机制(例如读取/写入互斥锁)

因此,要回答您的问题,如果唯一的访问是读取访问,则不需要同步。但是,如果您有时(甚至不经常)修改读取的信息,那么您需要某种机制。

如果他们只是在阅读,那么你不需要锁定。

如果他们只是在阅读,那么不需要锁定,但当情况并非如此时,我认为互斥体将确保读取线程在无事可做时不会消耗资源。

像这样的东西:-

Thread1() {
Mutex_lock();
Process global_variable;
Unlock_mutex();
}

同样适用于Thread2

附带说明:-

互斥通常用于防止多个线程同时访问共享内存或其他资源。还要记住,它不会自己锁定任何东西

相关文章: