C++ pthread,两个线程读取一个全局变量
C++ pthread, two threads read a global variable
如果有两个线程只读取一个全局变量,是否有必要使用互斥锁来锁定和解锁全局变量?
如果线程只读取变量并且没有人写入它(不是其中一个线程,也不是其他人),那么没有锁就完全没问题了。如果可能发生任何并发修改,那么每个人(包括纯读取器)都必须以某种方式同步 - 通过互斥锁,读/写锁或其他方式。
通常,需要独占访问以防止看到不一致的状态。对于读取器线程,这意味着避免部分读取。
那是什么意思?假设您有一个值存储在两个(原子)整数上,例如坐标。
int i = 3;
int j = 4;
现在,我们将在它们进行修改时读取i
和j
,更准确地说,当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
附带说明:-
互斥通常用于防止多个线程同时访问共享内存或其他资源。还要记住,它不会自己锁定任何东西
相关文章:
- C++试图读取一个文件并输出到另一个文本文件
- 我需要编写一个程序来读取一个文件,该文件将输出所有唯一的整数,如果已经看到整数,它将被关闭
- 试图打开并读取一个.txt文件,但它从原始文件中删除了实际文本(Qt GUI C++
- 如何从文本文件中一次读取一个字符
- 当我读取一个大小为 17 mb 的 100 万个 url 文件时,我的程序占用大小为 163 MB
- 无法一次从二进制文件中读取一个 int
- 无法使用 getline() 输入字符串.它只读取一个字符串
- 一次读取一个字节的 unicode
- 一次读取一个字符的文件,直到使用 read(2) 和 write(2) 换行符
- 快速简单的方法,以C++为单位一次读取一个字节的 stdin
- 尝试一次读取一个字符的矩阵
- 我可以在C 中的Windows中读取一个文件,而无需锁定包含文件的文件夹
- 要读取一个从一个游戏应用程序(In C )到我的Android应用程序的文件
- 无法读取一个.dat文件以创建第二个.dat文件
- 我正在尝试读取一个包含字符串和整数的二进制文件..并打印出与字符串对应的整数
- 如何从文件中一次读取一个输入,类似于在c++中使用cin/scanf从控制台读取输入
- C++最多读取一个字符或另一个字符
- 只从 cin 中读取一个字符
- 如何从IStream读取一个char数组并将其写入另一个IStream
- 为什么在我的测试程序中,从字符缓冲区读取一个int时,"std::copy"5x(!)比"