我一直在学习多线程应用程序,特别是关于如何使用互斥锁来防止竞争条件。但是,在编写一些代码时,我在代码中发现了竞争条件(使用@Service
@ConditionalOnProperty(prefix="my.property" , name = "enabled", havingValue = "true")
public class MyService {
}
中的helgrind
工具),我相信在解锁之后和返回之前,一个线程中的执行可能会暂停。
如果我们采用下面的示例代码,是互斥锁解锁和返回语句之间的竞争条件吗?如果是这样,我们如何解决这个问题呢?(不要求调用者传入某种缓冲区并返回一个常量值,如valgrind
)
0
注意:我知道在上面的例子中,返回' x'没用,因为x是全局的。但是,在一个图书馆中,' x'需要对库函数是全局的,但不能向用户公开,返回值变得很重要。
答案 0 :(得分:7)
以下是当前代码中的事件序列:
x
变量。 x
的阅读完全没有受到保护。
您需要做的是
x
变量。以便锁定保护读取。为此,在解锁锁之前将x
的值存储到非共享(本地)变量,并将其用作返回值:
int retval = x;
pthread_mutex_unlock(&mutex);
return retval;