1

我有一个带有多个 pthread 的程序。这些线程通过通用文件中的 get 和 set 函数将数据报告回静态变量。

static int LAT;
void getLat(){
    return LAT;
}
void setLAT(int lat){
    LAT = lat;
}

如果一个线程正在执行getLAT();而另一个线程同时执行会发生什么setLAT();?我的程序会崩溃吗?如果是这样,我该如何防止这种情况?

4

1 回答 1

3

这称为竞争条件并导致未定义的行为。什么事情都可能发生。崩溃不太可能发生,更有可能的是结果可能是写入之前、写入之后或写入中间值损坏的结果。

如果您尝试在系统调用中使用该损坏的值或作为指针偏移量等,那么此时将发生崩溃。

某些平台和架构将保证对与某个地址对齐的特定大小的对象进行原子读/写(例如,如果与 16 字节地址对齐,则进行原子 4 字节读取等),在这种情况下不会发生中间值(损坏) . 但是您不能真正依赖这种行为,因为它不可移植。即使不能保证这种行为,您的代码也可能在 99% 的情况下运行良好,除了生产中的那 1%,当您希望自己没有走捷径并且不打扰同步时。

您需要使用互斥体或像 cmpxchg 这样的原子读/写指令来保护您的代码免受这种竞争条件的影响。

于 2012-05-06T02:33:29.673 回答