有必要同步全局变量的使用
It's necessary to synchronize the use of the global variable
我有这个代码,这里需要同步使用全局变量c?流将同时开始工作并且一个线程将覆盖另一个线程的结果并最终获得 2 或 7 是否可行?
#include <iostream>
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
int c = 0;
void* write(void*)
{
c += 2;
}
void* read(void*)
{
c += 7;
}
int main()
{
pthread_t t1;
pthread_t t2;
std::cout << "first C = " << c << std::endl;
int r1 = pthread_create(&t1, 0, &write, 0);
int r2 = pthread_create(&t2, 0, &read, 0);
pthread_join(t1, 0);
pthread_join(t2, 0);
std::cout << " C = " << c << std::endl;
return 0;
}
是的,您需要保护对全局变量的访问。您要么需要使用互斥锁,要么需要使用原子类型(包括原子操作来修改它们)。
如果不这样做,问题是正常的+=
需要读取操作,添加一些值,然后将结果写回内存。如果两个线程同时执行此操作,它们可能会重叠,例如,两个线程都将读取示例代码中的0
,然后两个线程都写入其结果,这意味着最后一个写入操作获胜,因此另一个添加操作丢失。你最终会得到2
或7
,而不是你已经怀疑的9
。
如果您有多个线程可能同时访问一个对象,并且至少其中一个线程更改了该对象,则除非同步对该对象的访问,否则您将存在数据争用。如果您有数据争用,则程序的行为是未定义的。
也就是说,是的,您需要使用适当的同步来访问c
。
在 SMP 机器(具有单独的数据缓存内存)中,还有另一件微妙的事情需要考虑,那就是线程间内存同步。如果线程在不同的内核/CPU 中运行,即使两个线程更新c
运行时间不完全相同,它们也可能无法立即看到来自另一个线程的内存更新。例如,使用 pthread_mutex_t
进行同步将解决此问题。
请注意,pthread_join()
将内存与其他线程同步,因此在加入线程后不需要其他措施来保证c
看到其更新的值。
以下是保证提供与其他线程的内存同步的 POSIX 线程函数列表:http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_11。
相关文章:
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局变量 多读取器 一个写入器多线程安全?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- C++ 在编译时具有函数计算全局变量
- 修改程序的入口点时未调用全局变量的构造函数
- 使用 std::ios_base::Init 正确初始化全局变量
- 为什么我的全局变量似乎没有变化?
- C ++程序如何返回我的数组或写入全局变量
- 为什么我的数组值与此处的全局变量不匹配?
- QT C++中对全局变量的未定义引用
- 跨多个类的全局变量而不会出现重定义错误?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++线程不检测全局变量更改
- 有必要同步全局变量的使用
- 如何同步读取非常频繁/写入非常罕见的全局变量的访问