我有一个包含多个pthread的程序。这些线程通过公共文件中的get和set函数将数据报告回静态变量。
static int LAT;
void getLat(){
return LAT;
}
void setLAT(int lat){
LAT = lat;
}
如果一个线程正在执行getLAT();
而另一个正在同时执行setLAT();
,会发生什么?我的程序会崩溃吗?如果是这样,我怎么能阻止这个?
答案 0 :(得分:3)
这称为竞争条件,导致未定义的行为。什么事情都可能发生。崩溃是不太可能的,结果可能是写入之前,写入之后或写入中间值损坏的结果。
如果您尝试在系统调用中使用该损坏的值或作为指针偏移量等,那么此时将崩溃。
某些平台和体系结构将保证对某个地址对齐的特定大小的对象的原子读/写(例如,如果与16字节地址对齐,则为原子4字节读取等),在这种情况下,中间值(损坏)不会发生。但是你不能真正依赖这种行为,因为它不可移植。即使不能保证这种行为,你的代码也可能在99%的时间内正常运行,除了生产中的百分之一,当你希望你没有采用快捷方式而不打扰同步时。
您需要使用互斥锁或原子读/写指令(如cmpxchg)来保护您的代码免受此竞争条件的影响。